diff --git a/CMakeLists.txt b/CMakeLists.txt index c56bb7f6d..defb08ed5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ endmacro(add_gcc_compiler_flags) add_definitions(-DQT_NO_EXCEPTIONS -DQT_STRICT_ITERATORS -DQT_NO_CAST_TO_ASCII) -add_gcc_compiler_flags("-fno-common -fstack-protector --param=ssp-buffer-size=4") +add_gcc_compiler_flags("-fno-common -fstack-protector-strong --param=ssp-buffer-size=4") add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long") add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute") add_gcc_compiler_flags("-fvisibility=hidden") @@ -79,7 +79,7 @@ add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virt add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings") string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) -if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel)) +if (CMAKE_BUILD_TYPE_LOWER MATCHES "(release|relwithdebinfo|minsizerel)") add_gcc_compiler_flags("-D_FORTIFY_SOURCE=2") endif() @@ -105,10 +105,14 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if (CMAKE_COMPILER_IS_CLANGXX) + add_gcc_compiler_flags("-Qunused-arguments") + endif() + add_gcc_compiler_flags("-pie -fPIE") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now") endif() add_gcc_compiler_cxxflags("-std=c++11") @@ -127,6 +131,9 @@ if(MINGW) set(CMAKE_RC_COMPILER_INIT windres) enable_language(RC) set(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") + # Enable DEP and ASLR + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") link_libraries(ws2_32 wsock32) endif() diff --git a/README.md b/README.md index 4cb956bf2..2b6fd0315 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # KeePassXC - KeePass Cross-platform Community Edition [![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) +KeePassXC Authenticode Certificate Campaign! ## About KeePassXC is a community fork of [KeePassX](https://www.keepassx.org/) with the goal to extend and improve it with new features and bugfixes to provide a feature-rich, fully cross-platform and modern open-source password manager. diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 9799af4f3..311eedaab 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -48,13 +48,13 @@ public: static AutoType* instance(); static void createTestInstance(); -public Q_SLOTS: +public slots: void performGlobalAutoType(const QList& dbList); -Q_SIGNALS: +signals: void globalShortcutTriggered(); -private Q_SLOTS: +private slots: void performAutoTypeFromGlobal(Entry* entry, const QString& sequence); void resetInAutoType(); void unloadPlugin(); diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp index 6bb155b81..240dd723b 100644 --- a/src/autotype/AutoTypeSelectDialog.cpp +++ b/src/autotype/AutoTypeSelectDialog.cpp @@ -91,7 +91,7 @@ void AutoTypeSelectDialog::emitEntryActivated(const QModelIndex& index) Entry* entry = m_view->entryFromIndex(index); accept(); - Q_EMIT entryActivated(entry, m_sequences[entry]); + emit entryActivated(entry, m_sequences[entry]); } void AutoTypeSelectDialog::entryRemoved() diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h index 7b3909a19..3d9c684ed 100644 --- a/src/autotype/AutoTypeSelectDialog.h +++ b/src/autotype/AutoTypeSelectDialog.h @@ -33,13 +33,13 @@ public: explicit AutoTypeSelectDialog(QWidget* parent = nullptr); void setEntries(const QList& entries, const QHash& sequences); -Q_SIGNALS: +signals: void entryActivated(Entry* entry, const QString& sequence); -public Q_SLOTS: +public slots: void done(int r) override; -private Q_SLOTS: +private slots: void emitEntryActivated(const QModelIndex& index); void entryRemoved(); diff --git a/src/autotype/AutoTypeSelectView.h b/src/autotype/AutoTypeSelectView.h index 749f6a9f3..a781757b8 100644 --- a/src/autotype/AutoTypeSelectView.h +++ b/src/autotype/AutoTypeSelectView.h @@ -32,7 +32,7 @@ public: protected: void mouseMoveEvent(QMouseEvent* event) override; -private Q_SLOTS: +private slots: void selectFirstEntry(); }; diff --git a/src/autotype/mac/AutoTypeMac.cpp b/src/autotype/mac/AutoTypeMac.cpp index e55c336cb..08df6310e 100644 --- a/src/autotype/mac/AutoTypeMac.cpp +++ b/src/autotype/mac/AutoTypeMac.cpp @@ -460,7 +460,7 @@ OSStatus AutoTypePlatformMac::hotkeyHandler(EventHandlerCallRef nextHandler, Eve if (::GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, nullptr, sizeof(hotkeyId), nullptr, &hotkeyId) == noErr && hotkeyId.id == HOTKEY_ID) { - Q_EMIT self->globalShortcutTriggered(); + emit self->globalShortcutTriggered(); } return noErr; diff --git a/src/autotype/mac/AutoTypeMac.h b/src/autotype/mac/AutoTypeMac.h index 475a4b99b..5fbbf763b 100644 --- a/src/autotype/mac/AutoTypeMac.h +++ b/src/autotype/mac/AutoTypeMac.h @@ -51,7 +51,7 @@ public: void sendChar(const QChar& ch, bool isKeyDown); void sendKey(Qt::Key key, bool isKeyDown); -Q_SIGNALS: +signals: void globalShortcutTriggered(); private: diff --git a/src/autotype/test/AutoTypeTest.h b/src/autotype/test/AutoTypeTest.h index 4feaab942..d9a86c3de 100644 --- a/src/autotype/test/AutoTypeTest.h +++ b/src/autotype/test/AutoTypeTest.h @@ -60,7 +60,7 @@ public: void addActionChar(AutoTypeChar* action); void addActionKey(AutoTypeKey* action); -Q_SIGNALS: +signals: void globalShortcutTriggered(); private: diff --git a/src/autotype/windows/AutoTypeWindows.cpp b/src/autotype/windows/AutoTypeWindows.cpp index 481caa83f..0818a37bc 100644 --- a/src/autotype/windows/AutoTypeWindows.cpp +++ b/src/autotype/windows/AutoTypeWindows.cpp @@ -96,7 +96,7 @@ int AutoTypePlatformWin::platformEventFilter(void* event) MSG *msg = static_cast(event); if (msg->message == WM_HOTKEY && msg->wParam == HOTKEY_ID) { - Q_EMIT globalShortcutTriggered(); + emit globalShortcutTriggered(); return 1; } diff --git a/src/autotype/windows/AutoTypeWindows.h b/src/autotype/windows/AutoTypeWindows.h index 7a8c4bcab..f8b213cb0 100644 --- a/src/autotype/windows/AutoTypeWindows.h +++ b/src/autotype/windows/AutoTypeWindows.h @@ -45,7 +45,7 @@ public: void sendChar(const QChar& ch, bool isKeyDown); void sendKey(Qt::Key key, bool isKeyDown); -Q_SIGNALS: +signals: void globalShortcutTriggered(); private: diff --git a/src/autotype/xcb/AutoTypeXCB.cpp b/src/autotype/xcb/AutoTypeXCB.cpp index a07a916c4..e6ac74bbf 100644 --- a/src/autotype/xcb/AutoTypeXCB.cpp +++ b/src/autotype/xcb/AutoTypeXCB.cpp @@ -214,7 +214,7 @@ int AutoTypePlatformX11::platformEventFilter(void* event) && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized()) && m_loaded) { if (type == XCB_KEY_PRESS) { - Q_EMIT globalShortcutTriggered(); + emit globalShortcutTriggered(); } return 1; diff --git a/src/autotype/xcb/AutoTypeXCB.h b/src/autotype/xcb/AutoTypeXCB.h index 26d1e8102..dc251e3f9 100644 --- a/src/autotype/xcb/AutoTypeXCB.h +++ b/src/autotype/xcb/AutoTypeXCB.h @@ -59,7 +59,7 @@ public: void SendKeyPressedEvent(KeySym keysym); -Q_SIGNALS: +signals: void globalShortcutTriggered(); private: diff --git a/src/core/AutoTypeAssociations.cpp b/src/core/AutoTypeAssociations.cpp index 75d21fe3f..5ec4eb3b3 100644 --- a/src/core/AutoTypeAssociations.cpp +++ b/src/core/AutoTypeAssociations.cpp @@ -39,29 +39,29 @@ void AutoTypeAssociations::copyDataFrom(const AutoTypeAssociations* other) return; } - Q_EMIT aboutToReset(); + emit aboutToReset(); m_associations = other->m_associations; - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } void AutoTypeAssociations::add(const AutoTypeAssociations::Association& association) { int index = m_associations.size(); - Q_EMIT aboutToAdd(index); + emit aboutToAdd(index); m_associations.append(association); - Q_EMIT added(index); - Q_EMIT modified(); + emit added(index); + emit modified(); } void AutoTypeAssociations::remove(int index) { Q_ASSERT(index >= 0 && index < m_associations.size()); - Q_EMIT aboutToRemove(index); + emit aboutToRemove(index); m_associations.removeAt(index); - Q_EMIT removed(index); - Q_EMIT modified(); + emit removed(index); + emit modified(); } void AutoTypeAssociations::removeEmpty() @@ -81,8 +81,8 @@ void AutoTypeAssociations::update(int index, const AutoTypeAssociations::Associa if (m_associations.at(index) != association) { m_associations[index] = association; - Q_EMIT dataChanged(index); - Q_EMIT modified(); + emit dataChanged(index); + emit modified(); } } diff --git a/src/core/AutoTypeAssociations.h b/src/core/AutoTypeAssociations.h index 491a5db1c..61ef3fd4a 100644 --- a/src/core/AutoTypeAssociations.h +++ b/src/core/AutoTypeAssociations.h @@ -48,7 +48,7 @@ public: private: QList m_associations; -Q_SIGNALS: +signals: void modified(); void dataChanged(int index); void aboutToAdd(int index); diff --git a/src/core/Database.cpp b/src/core/Database.cpp index a441910d1..23b564143 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -238,7 +238,7 @@ bool Database::setKey(const CompositeKey& key, const QByteArray& transformSeed, if (updateChangedTime) { m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc()); } - Q_EMIT modifiedImmediate(); + emit modifiedImmediate(); return true; } @@ -310,7 +310,7 @@ void Database::recycleGroup(Group* group) void Database::merge(const Database* other) { m_rootGroup->merge(other->rootGroup()); - Q_EMIT modified(); + emit modified(); } void Database::setEmitModified(bool value) diff --git a/src/core/Database.h b/src/core/Database.h index 3f946a1cf..3767bb30d 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -119,7 +119,7 @@ public: static Database* databaseByUuid(const Uuid& uuid); -Q_SIGNALS: +signals: void groupDataChanged(Group* group); void groupAboutToAdd(Group* group, int index); void groupAdded(); @@ -131,7 +131,7 @@ Q_SIGNALS: void modified(); void modifiedImmediate(); -private Q_SLOTS: +private slots: void startModifiedTimer(); private: diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 99f119f66..7edf7e788 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -62,7 +62,7 @@ template inline bool Entry::set(T& property, const T& value) { if (property != value) { property = value; - Q_EMIT modified(); + emit modified(); return true; } else { @@ -254,6 +254,17 @@ bool Entry::isExpired() const return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc(); } +bool Entry::hasReferences() const +{ + const QList keyList = EntryAttributes::DefaultAttributes; + for (const QString& key : keyList) { + if (m_attributes->isReference(key)) { + return true; + } + } + return false; +} + EntryAttributes* Entry::attributes() { return m_attributes; @@ -288,7 +299,7 @@ void Entry::setIcon(int iconNumber) m_data.iconNumber = iconNumber; m_data.customIcon = Uuid(); - Q_EMIT modified(); + emit modified(); emitDataChanged(); } } @@ -301,7 +312,7 @@ void Entry::setIcon(const Uuid& uuid) m_data.customIcon = uuid; m_data.iconNumber = 0; - Q_EMIT modified(); + emit modified(); emitDataChanged(); } } @@ -381,7 +392,7 @@ void Entry::setExpires(const bool& value) { if (m_data.timeInfo.expires() != value) { m_data.timeInfo.setExpires(value); - Q_EMIT modified(); + emit modified(); } } @@ -389,7 +400,7 @@ void Entry::setExpiryTime(const QDateTime& dateTime) { if (m_data.timeInfo.expiryTime() != dateTime) { m_data.timeInfo.setExpiryTime(dateTime); - Q_EMIT modified(); + emit modified(); } } @@ -408,7 +419,7 @@ void Entry::addHistoryItem(Entry* entry) Q_ASSERT(!entry->parent()); m_history.append(entry); - Q_EMIT modified(); + emit modified(); } void Entry::removeHistoryItems(const QList& historyEntries) @@ -426,7 +437,7 @@ void Entry::removeHistoryItems(const QList& historyEntries) delete entry; } - Q_EMIT modified(); + emit modified(); } void Entry::truncateHistory() @@ -622,7 +633,7 @@ void Entry::setGroup(Group* group) void Entry::emitDataChanged() { - Q_EMIT dataChanged(this); + emit dataChanged(this); } const Database* Entry::database() const @@ -679,20 +690,20 @@ QString Entry::resolvePlaceholder(const QString& str) const // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, // but supporting lookups of standard fields and references by UUID only - QRegExp tmpRegExp("\\{REF:([TUPAN])@I:([^}]+)\\}", Qt::CaseInsensitive, QRegExp::RegExp2); - if (tmpRegExp.indexIn(result) != -1) { + QRegExp* tmpRegExp = m_attributes->referenceRegExp(); + if (tmpRegExp->indexIn(result) != -1) { // cap(0) contains the whole reference // cap(1) contains which field is wanted // cap(2) contains the uuid of the referenced entry - Entry* tmpRefEntry = m_group->database()->resolveEntry(Uuid(QByteArray::fromHex(tmpRegExp.cap(2).toLatin1()))); + Entry* tmpRefEntry = m_group->database()->resolveEntry(Uuid(QByteArray::fromHex(tmpRegExp->cap(2).toLatin1()))); if (tmpRefEntry) { // entry found, get the relevant field - QString tmpRefField = tmpRegExp.cap(1).toLower(); - if (tmpRefField == "t") result.replace(tmpRegExp.cap(0), tmpRefEntry->title(), Qt::CaseInsensitive); - else if (tmpRefField == "u") result.replace(tmpRegExp.cap(0), tmpRefEntry->username(), Qt::CaseInsensitive); - else if (tmpRefField == "p") result.replace(tmpRegExp.cap(0), tmpRefEntry->password(), Qt::CaseInsensitive); - else if (tmpRefField == "a") result.replace(tmpRegExp.cap(0), tmpRefEntry->url(), Qt::CaseInsensitive); - else if (tmpRefField == "n") result.replace(tmpRegExp.cap(0), tmpRefEntry->notes(), Qt::CaseInsensitive); + QString tmpRefField = tmpRegExp->cap(1).toLower(); + if (tmpRefField == "t") result.replace(tmpRegExp->cap(0), tmpRefEntry->title(), Qt::CaseInsensitive); + else if (tmpRefField == "u") result.replace(tmpRegExp->cap(0), tmpRefEntry->username(), Qt::CaseInsensitive); + else if (tmpRefField == "p") result.replace(tmpRegExp->cap(0), tmpRefEntry->password(), Qt::CaseInsensitive); + else if (tmpRefField == "a") result.replace(tmpRegExp->cap(0), tmpRefEntry->url(), Qt::CaseInsensitive); + else if (tmpRefField == "n") result.replace(tmpRegExp->cap(0), tmpRefEntry->notes(), Qt::CaseInsensitive); } } diff --git a/src/core/Entry.h b/src/core/Entry.h index d08c7217c..25b9bc386 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -79,6 +79,7 @@ public: QString password() const; QString notes() const; bool isExpired() const; + bool hasReferences() const; EntryAttributes* attributes(); const EntryAttributes* attributes() const; EntryAttachments* attachments(); @@ -146,7 +147,7 @@ public: void setUpdateTimeinfo(bool value); -Q_SIGNALS: +signals: /** * Emitted when a default attribute has been changed. */ @@ -154,7 +155,7 @@ Q_SIGNALS: void modified(); -private Q_SLOTS: +private slots: void emitDataChanged(); void updateTimeinfo(); void updateModifiedSinceBegin(); diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 7bd080bfa..a53a3c997 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -48,7 +48,7 @@ void EntryAttachments::set(const QString& key, const QByteArray& value) bool addAttachment = !m_attachments.contains(key); if (addAttachment) { - Q_EMIT aboutToBeAdded(key); + emit aboutToBeAdded(key); } if (addAttachment || m_attachments.value(key) != value) { @@ -57,14 +57,14 @@ void EntryAttachments::set(const QString& key, const QByteArray& value) } if (addAttachment) { - Q_EMIT added(key); + emit added(key); } else { - Q_EMIT keyModified(key); + emit keyModified(key); } if (emitModified) { - Q_EMIT modified(); + emit modified(); } } @@ -75,12 +75,12 @@ void EntryAttachments::remove(const QString& key) return; } - Q_EMIT aboutToBeRemoved(key); + emit aboutToBeRemoved(key); m_attachments.remove(key); - Q_EMIT removed(key); - Q_EMIT modified(); + emit removed(key); + emit modified(); } void EntryAttachments::clear() @@ -89,23 +89,23 @@ void EntryAttachments::clear() return; } - Q_EMIT aboutToBeReset(); + emit aboutToBeReset(); m_attachments.clear(); - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } void EntryAttachments::copyDataFrom(const EntryAttachments* other) { if (*this != *other) { - Q_EMIT aboutToBeReset(); + emit aboutToBeReset(); m_attachments = other->m_attachments; - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } } diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 903ca10bb..04c22cb34 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -38,7 +38,7 @@ public: bool operator==(const EntryAttachments& other) const; bool operator!=(const EntryAttachments& other) const; -Q_SIGNALS: +signals: void modified(); void keyModified(const QString& key); void aboutToBeAdded(const QString& key); diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index b633cae32..c689f8ad6 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -28,6 +28,7 @@ const QString EntryAttributes::RememberCmdExecAttr = "_EXEC_CMD"; EntryAttributes::EntryAttributes(QObject* parent) : QObject(parent) + , m_referenceRegExp("\\{REF:([TUPAN])@I:([^}]+)\\}", Qt::CaseInsensitive, QRegExp::RegExp2) { clear(); } @@ -69,6 +70,25 @@ bool EntryAttributes::isProtected(const QString& key) const return m_protectedAttributes.contains(key); } +bool EntryAttributes::isReference(const QString& key) const +{ + if (!m_attributes.contains(key)) { + Q_ASSERT(false); + return false; + } + + QString data = value(key); + if (m_referenceRegExp.indexIn(data) != -1) { + return true; + } + return false; +} + +QRegExp* EntryAttributes::referenceRegExp() +{ + return &m_referenceRegExp; +} + void EntryAttributes::set(const QString& key, const QString& value, bool protect) { bool emitModified = false; @@ -78,7 +98,7 @@ void EntryAttributes::set(const QString& key, const QString& value, bool protect bool defaultAttribute = isDefaultAttribute(key); if (addAttribute && !defaultAttribute) { - Q_EMIT aboutToBeAdded(key); + emit aboutToBeAdded(key); } if (addAttribute || changeValue) { @@ -97,17 +117,17 @@ void EntryAttributes::set(const QString& key, const QString& value, bool protect } if (emitModified) { - Q_EMIT modified(); + emit modified(); } if (defaultAttribute && changeValue) { - Q_EMIT defaultKeyModified(); + emit defaultKeyModified(); } else if (addAttribute) { - Q_EMIT added(key); + emit added(key); } else if (emitModified) { - Q_EMIT customKeyModified(key); + emit customKeyModified(key); } } @@ -120,13 +140,13 @@ void EntryAttributes::remove(const QString& key) return; } - Q_EMIT aboutToBeRemoved(key); + emit aboutToBeRemoved(key); m_attributes.remove(key); m_protectedAttributes.remove(key); - Q_EMIT removed(key); - Q_EMIT modified(); + emit removed(key); + emit modified(); } void EntryAttributes::rename(const QString& oldKey, const QString& newKey) @@ -147,7 +167,7 @@ void EntryAttributes::rename(const QString& oldKey, const QString& newKey) QString data = value(oldKey); bool protect = isProtected(oldKey); - Q_EMIT aboutToRename(oldKey, newKey); + emit aboutToRename(oldKey, newKey); m_attributes.remove(oldKey); m_attributes.insert(newKey, data); @@ -156,8 +176,8 @@ void EntryAttributes::rename(const QString& oldKey, const QString& newKey) m_protectedAttributes.insert(newKey); } - Q_EMIT modified(); - Q_EMIT renamed(oldKey, newKey); + emit modified(); + emit renamed(oldKey, newKey); } void EntryAttributes::copyCustomKeysFrom(const EntryAttributes* other) @@ -166,7 +186,7 @@ void EntryAttributes::copyCustomKeysFrom(const EntryAttributes* other) return; } - Q_EMIT aboutToBeReset(); + emit aboutToBeReset(); // remove all non-default keys const QList keyList = keys(); @@ -187,8 +207,8 @@ void EntryAttributes::copyCustomKeysFrom(const EntryAttributes* other) } } - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } bool EntryAttributes::areCustomKeysDifferent(const EntryAttributes* other) @@ -215,13 +235,13 @@ bool EntryAttributes::areCustomKeysDifferent(const EntryAttributes* other) void EntryAttributes::copyDataFrom(const EntryAttributes* other) { if (*this != *other) { - Q_EMIT aboutToBeReset(); + emit aboutToBeReset(); m_attributes = other->m_attributes; m_protectedAttributes = other->m_protectedAttributes; - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } } @@ -239,7 +259,7 @@ bool EntryAttributes::operator!=(const EntryAttributes& other) const void EntryAttributes::clear() { - Q_EMIT aboutToBeReset(); + emit aboutToBeReset(); m_attributes.clear(); m_protectedAttributes.clear(); @@ -248,8 +268,8 @@ void EntryAttributes::clear() m_attributes.insert(key, ""); } - Q_EMIT reset(); - Q_EMIT modified(); + emit reset(); + emit modified(); } int EntryAttributes::attributesSize() diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index 211b6d483..58f1db61d 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -35,6 +35,8 @@ public: QString value(const QString& key) const; bool contains(const QString& key) const; bool isProtected(const QString& key) const; + bool isReference(const QString& key) const; + QRegExp* referenceRegExp(); void set(const QString& key, const QString& value, bool protect = false); void remove(const QString& key); void rename(const QString& oldKey, const QString& newKey); @@ -55,7 +57,7 @@ public: static const QString RememberCmdExecAttr; static bool isDefaultAttribute(const QString& key); -Q_SIGNALS: +signals: void modified(); void defaultKeyModified(); void customKeyModified(const QString& key); @@ -71,6 +73,7 @@ Q_SIGNALS: private: QMap m_attributes; QSet m_protectedAttributes; + QRegExp m_referenceRegExp; }; #endif // KEEPASSX_ENTRYATTRIBUTES_H diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 8c96bb074..d8d609987 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -74,7 +74,7 @@ template inline bool Group::set(P& property, const V& value) if (property != value) { property = value; updateTimeinfo(); - Q_EMIT modified(); + emit modified(); return true; } else { @@ -249,7 +249,7 @@ void Group::setUuid(const Uuid& uuid) void Group::setName(const QString& name) { if (set(m_data.name, name)) { - Q_EMIT dataChanged(this); + emit dataChanged(this); } } @@ -267,8 +267,8 @@ void Group::setIcon(int iconNumber) m_data.customIcon = Uuid(); updateTimeinfo(); - Q_EMIT modified(); - Q_EMIT dataChanged(this); + emit modified(); + emit dataChanged(this); } } @@ -281,8 +281,8 @@ void Group::setIcon(const Uuid& uuid) m_data.iconNumber = 0; updateTimeinfo(); - Q_EMIT modified(); - Q_EMIT dataChanged(this); + emit modified(); + emit dataChanged(this); } } @@ -296,7 +296,7 @@ void Group::setExpanded(bool expanded) if (m_data.isExpanded != expanded) { m_data.isExpanded = expanded; updateTimeinfo(); - Q_EMIT modified(); + emit modified(); } } @@ -325,7 +325,7 @@ void Group::setExpires(bool value) if (m_data.timeInfo.expires() != value) { m_data.timeInfo.setExpires(value); updateTimeinfo(); - Q_EMIT modified(); + emit modified(); } } @@ -334,7 +334,7 @@ void Group::setExpiryTime(const QDateTime& dateTime) if (m_data.timeInfo.expiryTime() != dateTime) { m_data.timeInfo.setExpiryTime(dateTime); updateTimeinfo(); - Q_EMIT modified(); + emit modified(); } } @@ -391,12 +391,12 @@ void Group::setParent(Group* parent, int index) recSetDatabase(parent->m_db); } QObject::setParent(parent); - Q_EMIT aboutToAdd(this, index); + emit aboutToAdd(this, index); Q_ASSERT(index <= parent->m_children.size()); parent->m_children.insert(index, this); } else { - Q_EMIT aboutToMove(this, parent, index); + emit aboutToMove(this, parent, index); m_parent->m_children.removeAll(this); m_parent = parent; QObject::setParent(parent); @@ -408,13 +408,13 @@ void Group::setParent(Group* parent, int index) m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc()); } - Q_EMIT modified(); + emit modified(); if (!moveWithinDatabase) { - Q_EMIT added(); + emit added(); } else { - Q_EMIT moved(); + emit moved(); } } @@ -566,7 +566,7 @@ void Group::merge(const Group* other) } } - Q_EMIT modified(); + emit modified(); } Group* Group::findChildByName(const QString& name) @@ -623,7 +623,7 @@ void Group::addEntry(Entry* entry) Q_ASSERT(entry); Q_ASSERT(!m_entries.contains(entry)); - Q_EMIT entryAboutToAdd(entry); + emit entryAboutToAdd(entry); m_entries << entry; connect(entry, SIGNAL(dataChanged(Entry*)), SIGNAL(entryDataChanged(Entry*))); @@ -631,23 +631,23 @@ void Group::addEntry(Entry* entry) connect(entry, SIGNAL(modified()), m_db, SIGNAL(modifiedImmediate())); } - Q_EMIT modified(); - Q_EMIT entryAdded(entry); + emit modified(); + emit entryAdded(entry); } void Group::removeEntry(Entry* entry) { Q_ASSERT(m_entries.contains(entry)); - Q_EMIT entryAboutToRemove(entry); + emit entryAboutToRemove(entry); entry->disconnect(this); if (m_db) { entry->disconnect(m_db); } m_entries.removeAll(entry); - Q_EMIT modified(); - Q_EMIT entryRemoved(entry); + emit modified(); + emit entryRemoved(entry); } void Group::recSetDatabase(Database* db) @@ -693,10 +693,10 @@ void Group::recSetDatabase(Database* db) void Group::cleanupParent() { if (m_parent) { - Q_EMIT aboutToRemove(this); + emit aboutToRemove(this); m_parent->m_children.removeAll(this); - Q_EMIT modified(); - Q_EMIT removed(); + emit modified(); + emit removed(); } } diff --git a/src/core/Group.h b/src/core/Group.h index 3c054f976..e3e5e7554 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -122,7 +122,7 @@ public: void copyDataFrom(const Group* other); void merge(const Group* other); -Q_SIGNALS: +signals: void dataChanged(Group* group); void aboutToAdd(Group* group, int index); diff --git a/src/core/InactivityTimer.cpp b/src/core/InactivityTimer.cpp index dd162e695..0cfc8f0d4 100644 --- a/src/core/InactivityTimer.cpp +++ b/src/core/InactivityTimer.cpp @@ -73,7 +73,7 @@ void InactivityTimer::timeout() } if (m_active && !m_timer->isActive()) { - Q_EMIT inactivityDetected(); + emit inactivityDetected(); } m_emitMutx.unlock(); diff --git a/src/core/InactivityTimer.h b/src/core/InactivityTimer.h index ba571a5ef..b9de80fb4 100644 --- a/src/core/InactivityTimer.h +++ b/src/core/InactivityTimer.h @@ -33,13 +33,13 @@ public: void activate(); void deactivate(); -Q_SIGNALS: +signals: void inactivityDetected(); protected: bool eventFilter(QObject* watched, QEvent* event); -private Q_SLOTS: +private slots: void timeout(); private: diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index bf68af3ca..a7207b592 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -55,7 +55,7 @@ template bool Metadata::set(P& property, const V& value) { if (property != value) { property = value; - Q_EMIT modified(); + emit modified(); return true; } else { @@ -69,7 +69,7 @@ template bool Metadata::set(P& property, const V& value, QDat if (m_updateDatetime) { dateTime = QDateTime::currentDateTimeUtc(); } - Q_EMIT modified(); + emit modified(); return true; } else { @@ -308,7 +308,7 @@ void Metadata::setGenerator(const QString& value) void Metadata::setName(const QString& value) { if (set(m_data.name, value, m_data.nameChanged)) { - Q_EMIT nameTextChanged(); + emit nameTextChanged(); } } @@ -391,7 +391,7 @@ void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon) m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key(); m_customIconsOrder.append(uuid); Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); - Q_EMIT modified(); + emit modified(); } void Metadata::addCustomIconScaled(const Uuid& uuid, const QImage& icon) @@ -422,7 +422,7 @@ void Metadata::removeCustomIcon(const Uuid& uuid) m_customIconScaledCacheKeys.remove(uuid); m_customIconsOrder.removeAll(uuid); Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); - Q_EMIT modified(); + emit modified(); } void Metadata::copyCustomIcons(const QSet& iconList, const Metadata* otherMetadata) @@ -504,7 +504,7 @@ void Metadata::addCustomField(const QString& key, const QString& value) Q_ASSERT(!m_customFields.contains(key)); m_customFields.insert(key, value); - Q_EMIT modified(); + emit modified(); } void Metadata::removeCustomField(const QString& key) @@ -512,5 +512,5 @@ void Metadata::removeCustomField(const QString& key) Q_ASSERT(m_customFields.contains(key)); m_customFields.remove(key); - Q_EMIT modified(); + emit modified(); } diff --git a/src/core/Metadata.h b/src/core/Metadata.h index c35aed39b..4f435d759 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -146,7 +146,7 @@ public: */ void copyAttributesFrom(const Metadata* other); -Q_SIGNALS: +signals: void nameTextChanged(); void modified(); diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp index aea237a2e..cee1c55be 100644 --- a/src/core/PasswordGenerator.cpp +++ b/src/core/PasswordGenerator.cpp @@ -97,11 +97,11 @@ QString PasswordGenerator::generatePassword() const int PasswordGenerator::getbits() const { - QVector groups = passwordGroups(); + const QVector groups = passwordGroups(); int bits = 0; QVector passwordChars; - Q_FOREACH (const PasswordGroup& group, groups) { + for (const PasswordGroup& group: groups) { bits += group.size(); } diff --git a/src/gui/Application.cpp b/src/gui/Application.cpp index 4c84fda86..f64a766f5 100644 --- a/src/gui/Application.cpp +++ b/src/gui/Application.cpp @@ -101,7 +101,7 @@ bool Application::event(QEvent* event) { // Handle Apple QFileOpenEvent from finder (double click on .kdbx file) if (event->type() == QEvent::FileOpen) { - Q_EMIT openFile(static_cast(event)->file()); + emit openFile(static_cast(event)->file()); return true; } #ifdef Q_OS_MAC @@ -153,7 +153,7 @@ void Application::handleUnixSignal(int sig) case SIGTERM: { char buf = 0; - ::write(unixSignalSocket[0], &buf, sizeof(buf)); + Q_UNUSED(::write(unixSignalSocket[0], &buf, sizeof(buf))); return; } case SIGHUP: @@ -165,7 +165,7 @@ void Application::quitBySignal() { m_unixSignalNotifier->setEnabled(false); char buf; - ::read(unixSignalSocket[1], &buf, sizeof(buf)); + Q_UNUSED(::read(unixSignalSocket[1], &buf, sizeof(buf))); if (nullptr != m_mainWindow) static_cast(m_mainWindow)->appExit(); diff --git a/src/gui/Application.h b/src/gui/Application.h index c6f4aae66..fd5ad12e0 100644 --- a/src/gui/Application.h +++ b/src/gui/Application.h @@ -34,10 +34,10 @@ public: bool event(QEvent* event) override; -Q_SIGNALS: +signals: void openFile(const QString& filename); -private Q_SLOTS: +private slots: #if defined(Q_OS_UNIX) void quitBySignal(); #endif diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h index dafce70a2..e0a16d26d 100644 --- a/src/gui/Clipboard.h +++ b/src/gui/Clipboard.h @@ -31,10 +31,10 @@ public: static Clipboard* instance(); -public Q_SLOTS: +public slots: void clearCopiedText(); -private Q_SLOTS: +private slots: void clearClipboard(); private: diff --git a/src/gui/CloneDialog.h b/src/gui/CloneDialog.h index 277da4a82..094b0fe7d 100644 --- a/src/gui/CloneDialog.h +++ b/src/gui/CloneDialog.h @@ -39,7 +39,7 @@ public: private: QScopedPointer m_ui; -private Q_SLOTS: +private slots: void cloneEntry(); protected: diff --git a/src/gui/DatabaseRepairWidget.cpp b/src/gui/DatabaseRepairWidget.cpp index e48e0f1f6..2b0039408 100644 --- a/src/gui/DatabaseRepairWidget.cpp +++ b/src/gui/DatabaseRepairWidget.cpp @@ -50,7 +50,7 @@ void DatabaseRepairWidget::openDatabase() QString errorMsg; if (!key.load(keyFilename, &errorMsg)) { MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg)); - Q_EMIT editFinished(false); + emit editFinished(false); return; } masterKey.addKey(key); @@ -62,7 +62,7 @@ void DatabaseRepairWidget::openDatabase() if (!file.open(QIODevice::ReadOnly)) { MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(file.errorString())); - Q_EMIT editFinished(false); + emit editFinished(false); return; } if (m_db) { @@ -75,21 +75,21 @@ void DatabaseRepairWidget::openDatabase() switch (repairResult) { case KeePass2Repair::NothingTodo: MessageBox::information(this, tr("Error"), tr("Database opened fine. Nothing to do.")); - Q_EMIT editFinished(false); + emit editFinished(false); return; case KeePass2Repair::UnableToOpen: MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(repair.errorString())); - Q_EMIT editFinished(false); + emit editFinished(false); return; case KeePass2Repair::RepairSuccess: m_db = repair.database(); MessageBox::warning(this, tr("Success"), tr("The database has been successfully repaired\nYou can now save it.")); - Q_EMIT editFinished(true); + emit editFinished(true); return; case KeePass2Repair::RepairFailed: MessageBox::warning(this, tr("Error"), tr("Unable to repair the database.")); - Q_EMIT editFinished(false); + emit editFinished(false); return; } } @@ -97,9 +97,9 @@ void DatabaseRepairWidget::openDatabase() void DatabaseRepairWidget::processEditFinished(bool result) { if (result) { - Q_EMIT success(); + emit success(); } else { - Q_EMIT error(); + emit error(); } } diff --git a/src/gui/DatabaseRepairWidget.h b/src/gui/DatabaseRepairWidget.h index 6775d2dc1..67b48ce54 100644 --- a/src/gui/DatabaseRepairWidget.h +++ b/src/gui/DatabaseRepairWidget.h @@ -27,14 +27,14 @@ class DatabaseRepairWidget : public DatabaseOpenWidget public: explicit DatabaseRepairWidget(QWidget* parent = nullptr); -Q_SIGNALS: +signals: void success(); void error(); protected: void openDatabase() override; -private Q_SLOTS: +private slots: void processEditFinished(bool result); }; diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 59a3c5c3a..7c51edfd4 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -124,12 +124,12 @@ void DatabaseSettingsWidget::save() truncateHistories(); } - Q_EMIT editFinished(true); + emit editFinished(true); } void DatabaseSettingsWidget::reject() { - Q_EMIT editFinished(false); + emit editFinished(false); } void DatabaseSettingsWidget::transformRoundsBenchmark() diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index 040e0dbe7..733b32f87 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -38,10 +38,10 @@ public: void load(Database* db); -Q_SIGNALS: +signals: void editFinished(bool accepted); -private Q_SLOTS: +private slots: void save(); void reject(); void transformRoundsBenchmark(); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 468a453a5..6626b3428 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -120,7 +120,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, QFileInfo fileInfo(fileName); QString canonicalFilePath = fileInfo.canonicalFilePath(); if (canonicalFilePath.isEmpty()) { - Q_EMIT messageGlobal(tr("File not found!"), MessageWidget::Error); + emit messageGlobal(tr("File not found!"), MessageWidget::Error); return; } @@ -141,7 +141,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, if (!file.open(QIODevice::ReadWrite)) { if (!file.open(QIODevice::ReadOnly)) { // can't open - Q_EMIT messageGlobal( + emit messageGlobal( tr("Unable to open the database.").append("\n").append(file.errorString()), MessageWidget::Error); return; } @@ -198,7 +198,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, insertDatabase(db, dbStruct); if (dbStruct.readOnly) { - Q_EMIT messageTab(tr("File opened in read only mode."), MessageWidget::Warning); + emit messageTab(tr("File opened in read only mode."), MessageWidget::Warning); } updateLastDatabases(dbStruct.filePath); @@ -209,7 +209,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, else { dbStruct.dbWidget->switchToOpenDatabase(dbStruct.filePath); } - Q_EMIT messageDismissGlobal(); + emit messageDismissGlobal(); } void DatabaseTabWidget::mergeDatabase() @@ -314,7 +314,7 @@ void DatabaseTabWidget::deleteDatabase(Database* db) delete db; if (emitDatabaseWithFileClosed) { - Q_EMIT databaseWithFileClosed(filePath); + emit databaseWithFileClosed(filePath); } } @@ -501,7 +501,7 @@ void DatabaseTabWidget::exportToCsv() CsvExporter csvExporter; if (!csvExporter.exportDatabase(fileName, db)) { - Q_EMIT messageGlobal( + emit messageGlobal( tr("Writing the CSV file failed.").append("\n") .append(csvExporter.errorString()), MessageWidget::Error); } @@ -563,7 +563,7 @@ void DatabaseTabWidget::updateTabName(Database* db) } setTabText(index, tabName); - Q_EMIT tabNameChanged(); + emit tabNameChanged(); } void DatabaseTabWidget::updateTabNameFromDbSender() @@ -743,7 +743,7 @@ void DatabaseTabWidget::lockDatabases() // database has changed so we can't use the db variable anymore updateTabName(dbWidget->database()); - Q_EMIT databaseLocked(dbWidget); + emit databaseLocked(dbWidget); } } @@ -801,12 +801,12 @@ void DatabaseTabWidget::changeDatabase(Database* newDb, bool unsavedChanges) void DatabaseTabWidget::emitActivateDatabaseChanged() { - Q_EMIT activateDatabaseChanged(currentDatabaseWidget()); + emit activateDatabaseChanged(currentDatabaseWidget()); } void DatabaseTabWidget::emitDatabaseUnlockedFromDbWidgetSender() { - Q_EMIT databaseUnlocked(static_cast(sender())); + emit databaseUnlocked(static_cast(sender())); } void DatabaseTabWidget::connectDatabase(Database* newDb, Database* oldDb) diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 6eabcd49c..6fa783dd0 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -63,7 +63,7 @@ public: static const int LastDatabasesCount; -public Q_SLOTS: +public slots: void newDatabase(); void openDatabase(); void mergeDatabase(); @@ -80,7 +80,7 @@ public Q_SLOTS: void performGlobalAutoType(); void lockDatabases(); -Q_SIGNALS: +signals: void tabNameChanged(); void databaseWithFileClosed(QString filePath); void activateDatabaseChanged(DatabaseWidget* dbWidget); @@ -91,7 +91,7 @@ Q_SIGNALS: void messageDismissGlobal(); void messageDismissTab(); -private Q_SLOTS: +private slots: void updateTabName(Database* db); void updateTabNameFromDbSender(); void updateTabNameFromDbWidgetSender(); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 54b8eed9c..8a40b6364 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -263,7 +263,7 @@ void DatabaseWidget::clearAllWidgets() void DatabaseWidget::emitCurrentModeChanged() { - Q_EMIT currentModeChanged(currentMode()); + emit currentModeChanged(currentMode()); } Database* DatabaseWidget::database() @@ -309,7 +309,7 @@ void DatabaseWidget::replaceDatabase(Database* db) Database* oldDb = m_db; m_db = db; m_groupView->changeDatabase(m_db); - Q_EMIT databaseChanged(m_db, m_databaseModified); + emit databaseChanged(m_db, m_databaseModified); delete oldDb; } @@ -700,7 +700,7 @@ void DatabaseWidget::updateMasterKey(bool accepted) } } else if (!m_db->hasKey()) { - Q_EMIT closeRequest(); + emit closeRequest(); return; } @@ -712,7 +712,7 @@ void DatabaseWidget::openDatabase(bool accepted) if (accepted) { replaceDatabase(static_cast(sender())->database()); setCurrentWidget(m_mainWidget); - Q_EMIT unlockedDatabase(); + emit unlockedDatabase(); // We won't need those anymore and KeePass1OpenWidget closes // the file in its dtor. @@ -727,7 +727,7 @@ void DatabaseWidget::openDatabase(bool accepted) if (m_databaseOpenWidget->database()) { delete m_databaseOpenWidget->database(); } - Q_EMIT closeRequest(); + emit closeRequest(); } } @@ -750,13 +750,13 @@ void DatabaseWidget::mergeDatabase(bool accepted) } setCurrentWidget(m_mainWidget); - Q_EMIT databaseMerged(m_db); + emit databaseMerged(m_db); } void DatabaseWidget::unlockDatabase(bool accepted) { if (!accepted) { - Q_EMIT closeRequest(); + emit closeRequest(); return; } @@ -775,7 +775,7 @@ void DatabaseWidget::unlockDatabase(bool accepted) setCurrentWidget(m_mainWidget); m_unlockDatabaseWidget->clearForms(); - Q_EMIT unlockedDatabase(); + emit unlockedDatabase(); if (sender() == m_unlockDatabaseDialog) { QList dbList; @@ -888,7 +888,7 @@ void DatabaseWidget::search(const QString& searchtext) return; } - Q_EMIT searchModeAboutToActivate(); + emit searchModeAboutToActivate(); Qt::CaseSensitivity caseSensitive = m_searchCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; @@ -907,7 +907,7 @@ void DatabaseWidget::search(const QString& searchtext) m_searchingLabel->setVisible(true); - Q_EMIT searchModeActivated(); + emit searchModeActivated(); } void DatabaseWidget::setSearchCaseSensitive(bool state) @@ -934,12 +934,12 @@ void DatabaseWidget::endSearch() { if (isInSearchMode()) { - Q_EMIT listModeAboutToActivate(); + emit listModeAboutToActivate(); // Show the normal entry view of the current group m_entryView->setGroup(currentGroup()); - Q_EMIT listModeActivated(); + emit listModeActivated(); } m_searchingLabel->setVisible(false); @@ -950,12 +950,12 @@ void DatabaseWidget::endSearch() void DatabaseWidget::emitGroupContextMenuRequested(const QPoint& pos) { - Q_EMIT groupContextMenuRequested(m_groupView->viewport()->mapToGlobal(pos)); + emit groupContextMenuRequested(m_groupView->viewport()->mapToGlobal(pos)); } void DatabaseWidget::emitEntryContextMenuRequested(const QPoint& pos) { - Q_EMIT entryContextMenuRequested(m_entryView->viewport()->mapToGlobal(pos)); + emit entryContextMenuRequested(m_entryView->viewport()->mapToGlobal(pos)); } bool DatabaseWidget::dbHasKey() const diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index a4861179e..96ecd104a 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -29,12 +29,12 @@ public: explicit DatabaseWidgetStateSync(QObject* parent = nullptr); ~DatabaseWidgetStateSync(); -public Q_SLOTS: +public slots: void setActive(DatabaseWidget* dbWidget); void restoreListView(); void restoreSearchView(); -private Q_SLOTS: +private slots: void blockUpdates(); void updateSplitterSizes(); void updateColumnSizes(); diff --git a/src/gui/DragTabBar.h b/src/gui/DragTabBar.h index a6117a047..38de10dab 100644 --- a/src/gui/DragTabBar.h +++ b/src/gui/DragTabBar.h @@ -34,7 +34,7 @@ protected: void dropEvent(QDropEvent* event) override; void tabLayoutChange() override; -private Q_SLOTS: +private slots: void dragSwitchTab(); private: diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 1e1f5db29..7b46728c1 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -48,9 +48,9 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent) , m_defaultIconModel(new DefaultIconModel(this)) , m_customIconModel(new CustomIconModel(this)) #ifdef WITH_XC_HTTP - , m_httpClient(nullptr) , m_fallbackToGoogle(true) , m_redirectCount(0) + , m_httpClient(nullptr) #endif { m_ui->setupUi(this); @@ -149,6 +149,7 @@ void EditWidgetIcons::setUrl(const QString& url) m_ui->faviconButton->setVisible(!url.isEmpty()); resetFaviconDownload(); #else + Q_UNUSED(url); m_ui->faviconButton->setVisible(false); #endif } @@ -275,7 +276,7 @@ void EditWidgetIcons::addCustomIcon() m_ui->customIconsView->setCurrentIndex(index); } else { - Q_EMIT messageEditEntry(tr("Can't read icon"), MessageWidget::Error); + emit messageEditEntry(tr("Can't read icon"), MessageWidget::Error); } } } diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h index b0ff6c6c9..745914bca 100644 --- a/src/gui/EditWidgetIcons.h +++ b/src/gui/EditWidgetIcons.h @@ -63,14 +63,14 @@ public: void reset(); void load(const Uuid& currentUuid, Database* database, const IconStruct& iconStruct, const QString& url = ""); -public Q_SLOTS: +public slots: void setUrl(const QString& url); -Q_SIGNALS: +signals: void messageEditEntry(QString, MessageWidget::MessageType); void messageEditEntryDismiss(); -private Q_SLOTS: +private slots: void downloadFavicon(); #ifdef WITH_XC_HTTP void fetchFavicon(const QUrl& url); diff --git a/src/gui/KMessageWidget.cpp b/src/gui/KMessageWidget.cpp index b88c3bc12..7f4cb94f4 100644 --- a/src/gui/KMessageWidget.cpp +++ b/src/gui/KMessageWidget.cpp @@ -21,6 +21,7 @@ #include "KMessageWidget.h" #include "core/FilePath.h" +#include "core/Global.h" #include #include @@ -117,7 +118,8 @@ void KMessageWidgetPrivate::createLayout() qDeleteAll(buttons); buttons.clear(); - Q_FOREACH (QAction *action, q->actions()) { + const auto actions = q->actions(); + for (QAction *action: actions) { QToolButton *button = new QToolButton(content); button->setDefaultAction(action); button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); @@ -137,7 +139,7 @@ void KMessageWidgetPrivate::createLayout() QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); - Q_FOREACH (QToolButton *button, buttons) { + for (QToolButton* button: asConst(buttons)) { // For some reason, calling show() is necessary if wordwrap is true, // otherwise the buttons do not show up. It is not needed if // wordwrap is false. @@ -151,7 +153,7 @@ void KMessageWidgetPrivate::createLayout() layout->addWidget(iconLabel); layout->addWidget(textLabel); - Q_FOREACH (QToolButton *button, buttons) { + for (QToolButton* button: asConst(buttons)) { layout->addWidget(button); } diff --git a/src/gui/KMessageWidget.h b/src/gui/KMessageWidget.h index 4398e0f99..d47e78f9c 100644 --- a/src/gui/KMessageWidget.h +++ b/src/gui/KMessageWidget.h @@ -224,7 +224,7 @@ public: */ bool isShowAnimationRunning() const; -public Q_SLOTS: +public slots: /** * Set the text of the message widget to @p text. * If the message widget is already visible, the text changes on the fly. @@ -277,7 +277,7 @@ public Q_SLOTS: */ void setIcon(const QIcon &icon); -Q_SIGNALS: +signals: /** * This signal is emitted when the user clicks a link in the text label. * The URL referred to by the href anchor is passed in contents. diff --git a/src/gui/KeePass1OpenWidget.cpp b/src/gui/KeePass1OpenWidget.cpp index b63bbc485..915864241 100644 --- a/src/gui/KeePass1OpenWidget.cpp +++ b/src/gui/KeePass1OpenWidget.cpp @@ -62,7 +62,7 @@ void KeePass1OpenWidget::openDatabase() if (m_db) { m_db->metadata()->setName(QFileInfo(m_filename).completeBaseName()); - Q_EMIT editFinished(true); + emit editFinished(true); } else { m_ui->messageWidget->showMessage(tr("Unable to open the database.").append("\n") diff --git a/src/gui/LineEdit.h b/src/gui/LineEdit.h index f5f058401..1695e8551 100644 --- a/src/gui/LineEdit.h +++ b/src/gui/LineEdit.h @@ -34,7 +34,7 @@ public: protected: void resizeEvent(QResizeEvent* event) override; -private Q_SLOTS: +private slots: void updateCloseButton(const QString& text); private: diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 7104562f2..cc7037959 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -40,7 +40,7 @@ public: MainWindow(); ~MainWindow(); -public Q_SLOTS: +public slots: void openDatabase(const QString& fileName, const QString& pw = QString(), const QString& keyFile = QString()); void appExit(); @@ -54,7 +54,7 @@ protected: void closeEvent(QCloseEvent* event) override; void changeEvent(QEvent* event) override; -private Q_SLOTS: +private slots: void setMenuActionState(DatabaseWidget::Mode mode = DatabaseWidget::None); void updateWindowTitle(); void showAboutDialog(); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 6e3ecf684..1d57d557c 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -123,9 +123,7 @@ - - horizontalSpacer_2 - + diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index 34c06743c..a6c9425dc 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -27,7 +27,7 @@ class MessageWidget : public KMessageWidget public: explicit MessageWidget(QWidget* parent = 0); -public Q_SLOTS: +public slots: void showMessage(const QString& text, MessageWidget::MessageType type); void hideMessage(); diff --git a/src/gui/PasswordComboBox.h b/src/gui/PasswordComboBox.h index 7c54e278b..f7f118edf 100644 --- a/src/gui/PasswordComboBox.h +++ b/src/gui/PasswordComboBox.h @@ -35,7 +35,7 @@ public: void setNumberAlternatives(int alternatives); void showPopup(); -public Q_SLOTS: +public slots: void setEcho(bool echo); private: diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp index 98a5e2a50..095a4e14f 100644 --- a/src/gui/PasswordEdit.cpp +++ b/src/gui/PasswordEdit.cpp @@ -69,7 +69,7 @@ void PasswordEdit::setShowPassword(bool show) } } updateStylesheet(); - Q_EMIT showPasswordChanged(show); + emit showPasswordChanged(show); } bool PasswordEdit::passwordsEqual() const diff --git a/src/gui/PasswordEdit.h b/src/gui/PasswordEdit.h index 994576d23..d527432d5 100644 --- a/src/gui/PasswordEdit.h +++ b/src/gui/PasswordEdit.h @@ -31,13 +31,13 @@ public: explicit PasswordEdit(QWidget* parent = nullptr); void enableVerifyMode(PasswordEdit* baseEdit); -public Q_SLOTS: +public slots: void setShowPassword(bool show); -Q_SIGNALS: +signals: void showPasswordChanged(bool show); -private Q_SLOTS: +private slots: void updateStylesheet(); void autocompletePassword(QString password); diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 4a4b438e3..11d50bae8 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -145,8 +145,8 @@ void PasswordGeneratorWidget::generatePassword() void PasswordGeneratorWidget::applyPassword() { saveSettings(); - Q_EMIT appliedPassword(m_ui->editNewPassword->text()); - Q_EMIT dialogTerminated(); + emit appliedPassword(m_ui->editNewPassword->text()); + emit dialogTerminated(); } void PasswordGeneratorWidget::sliderMoved() diff --git a/src/gui/PasswordGeneratorWidget.h b/src/gui/PasswordGeneratorWidget.h index b8803f85e..bfa6d684e 100644 --- a/src/gui/PasswordGeneratorWidget.h +++ b/src/gui/PasswordGeneratorWidget.h @@ -43,11 +43,11 @@ public: void setStandaloneMode(bool standalone); void regeneratePassword(); -Q_SIGNALS: +signals: void appliedPassword(const QString& password); void dialogTerminated(); -private Q_SLOTS: +private slots: void applyPassword(); void generatePassword(); void updateApplyEnabled(const QString& password); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 3ec9674fe..62af276e8 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -23,6 +23,7 @@ #include "core/Config.h" #include "core/Translator.h" #include "core/FilePath.h" +#include "core/Global.h" class SettingsWidget::ExtraPage { @@ -144,8 +145,9 @@ void SettingsWidget::loadSettings() m_secUi->passwordRepeatCheckBox->setChecked(config()->get("security/passwordsrepeat").toBool()); - Q_FOREACH (const ExtraPage& page, m_extraPages) + for (const ExtraPage& page: asConst(m_extraPages)) { page.loadSettings(); + } setCurrentPage(0); } @@ -190,10 +192,11 @@ void SettingsWidget::saveSettings() config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked()); config()->set("security/passwordsrepeat", m_secUi->passwordRepeatCheckBox->isChecked()); - Q_FOREACH (const ExtraPage& page, m_extraPages) + for (const ExtraPage& page: asConst(m_extraPages)) { page.saveSettings(); + } - Q_EMIT editFinished(true); + emit editFinished(true); } void SettingsWidget::reject() @@ -203,7 +206,7 @@ void SettingsWidget::reject() autoType()->registerGlobalShortcut(m_globalAutoTypeKey, m_globalAutoTypeModifiers); } - Q_EMIT editFinished(false); + emit editFinished(false); } void SettingsWidget::enableAutoSaveOnExit(bool checked) diff --git a/src/gui/SettingsWidget.h b/src/gui/SettingsWidget.h index e94f48767..7037b2e37 100644 --- a/src/gui/SettingsWidget.h +++ b/src/gui/SettingsWidget.h @@ -45,10 +45,10 @@ public: void addSettingsPage(ISettingsPage * page); void loadSettings(); -Q_SIGNALS: +signals: void editFinished(bool accepted); -private Q_SLOTS: +private slots: void saveSettings(); void reject(); void enableAutoSaveOnExit(bool checked); diff --git a/src/gui/UnlockDatabaseDialog.cpp b/src/gui/UnlockDatabaseDialog.cpp index 679493903..3d002f756 100644 --- a/src/gui/UnlockDatabaseDialog.cpp +++ b/src/gui/UnlockDatabaseDialog.cpp @@ -49,7 +49,7 @@ void UnlockDatabaseDialog::complete(bool r) { if (r) { accept(); - Q_EMIT unlockDone(true); + emit unlockDone(true); } else { reject(); } diff --git a/src/gui/UnlockDatabaseDialog.h b/src/gui/UnlockDatabaseDialog.h index 1ba6d2e06..daf8a0f1f 100644 --- a/src/gui/UnlockDatabaseDialog.h +++ b/src/gui/UnlockDatabaseDialog.h @@ -36,10 +36,10 @@ public: void clearForms(); Database* database(); -Q_SIGNALS: +signals: void unlockDone(bool); -public Q_SLOTS: +public slots: void complete(bool r); private: diff --git a/src/gui/WelcomeWidget.cpp b/src/gui/WelcomeWidget.cpp index cb7a1de2e..d327ea84c 100644 --- a/src/gui/WelcomeWidget.cpp +++ b/src/gui/WelcomeWidget.cpp @@ -64,5 +64,5 @@ void WelcomeWidget::openDatabaseFromFile(QListWidgetItem* item) if (item->text().isEmpty()) { return; } - Q_EMIT openDatabaseFile(item->text()); + emit openDatabaseFile(item->text()); } \ No newline at end of file diff --git a/src/gui/WelcomeWidget.h b/src/gui/WelcomeWidget.h index dbd0d2e27..73c8c4f9b 100644 --- a/src/gui/WelcomeWidget.h +++ b/src/gui/WelcomeWidget.h @@ -33,13 +33,13 @@ public: explicit WelcomeWidget(QWidget* parent = nullptr); ~WelcomeWidget(); -Q_SIGNALS: +signals: void newDatabase(); void openDatabase(); void openDatabaseFile(QString); void importKeePass1Database(); -private Q_SLOTS: +private slots: void openDatabaseFromFile(QListWidgetItem* item); private: diff --git a/src/gui/entry/AutoTypeAssociationsModel.cpp b/src/gui/entry/AutoTypeAssociationsModel.cpp index 49f6786b3..4a76233b4 100644 --- a/src/gui/entry/AutoTypeAssociationsModel.cpp +++ b/src/gui/entry/AutoTypeAssociationsModel.cpp @@ -103,7 +103,7 @@ QVariant AutoTypeAssociationsModel::data(const QModelIndex& index, int role) con void AutoTypeAssociationsModel::associationChange(int i) { - Q_EMIT dataChanged(index(i, 0), index(i, columnCount() - 1)); + emit dataChanged(index(i, 0), index(i, columnCount() - 1)); } void AutoTypeAssociationsModel::associationAboutToAdd(int i) diff --git a/src/gui/entry/AutoTypeAssociationsModel.h b/src/gui/entry/AutoTypeAssociationsModel.h index c75168c32..cef8bc66b 100644 --- a/src/gui/entry/AutoTypeAssociationsModel.h +++ b/src/gui/entry/AutoTypeAssociationsModel.h @@ -36,7 +36,7 @@ public: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; -public Q_SLOTS: +public slots: void associationChange(int i); void associationAboutToAdd(int i); void associationAdd(); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 51e0bb735..4581c91f0 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -132,6 +132,8 @@ void EditEntryWidget::setupAdvanced() connect(m_advancedUi->addAttributeButton, SIGNAL(clicked()), SLOT(insertAttribute())); connect(m_advancedUi->editAttributeButton, SIGNAL(clicked()), SLOT(editCurrentAttribute())); connect(m_advancedUi->removeAttributeButton, SIGNAL(clicked()), SLOT(removeCurrentAttribute())); + connect(m_advancedUi->protectAttributeButton, SIGNAL(toggled(bool)), SLOT(protectCurrentAttribute(bool))); + connect(m_advancedUi->revealAttributeButton, SIGNAL(clicked(bool)), SLOT(revealCurrentAttribute())); connect(m_advancedUi->attributesView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(updateCurrentAttribute())); @@ -210,7 +212,7 @@ void EditEntryWidget::emitHistoryEntryActivated(const QModelIndex& index) Q_ASSERT(!m_history); Entry* entry = m_historyModel->entryFromIndex(index); - Q_EMIT historyEntryActivated(entry); + emit historyEntryActivated(entry); } void EditEntryWidget::histEntryActivated(const QModelIndex& index) @@ -351,6 +353,11 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_advancedUi->attributesEdit->setEnabled(false); } + QList sizes = m_advancedUi->attributesSplitter->sizes(); + sizes.replace(0, m_advancedUi->attributesSplitter->width() * 0.3); + sizes.replace(1, m_advancedUi->attributesSplitter->width() * 0.7); + m_advancedUi->attributesSplitter->setSizes(sizes); + IconStruct iconStruct; iconStruct.uuid = entry->iconUuid(); iconStruct.number = entry->iconNumber(); @@ -400,7 +407,7 @@ void EditEntryWidget::saveEntry() if (m_history) { clear(); hideMessage(); - Q_EMIT editFinished(false); + emit editFinished(false); return; } @@ -409,7 +416,7 @@ void EditEntryWidget::saveEntry() return; } - if (m_advancedUi->attributesView->currentIndex().isValid()) { + if (m_advancedUi->attributesView->currentIndex().isValid() && m_advancedUi->attributesEdit->isEnabled()) { QString key = m_attributesModel->keyByIndex(m_advancedUi->attributesView->currentIndex()); m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(), m_entryAttributes->isProtected(key)); @@ -435,7 +442,7 @@ void EditEntryWidget::saveEntry() clear(); - Q_EMIT editFinished(true); + emit editFinished(true); } void EditEntryWidget::updateEntryData(Entry* entry) const @@ -480,7 +487,7 @@ void EditEntryWidget::cancel() if (m_history) { clear(); hideMessage(); - Q_EMIT editFinished(false); + emit editFinished(false); return; } @@ -491,7 +498,7 @@ void EditEntryWidget::cancel() clear(); - Q_EMIT editFinished(false); + emit editFinished(false); } void EditEntryWidget::clear() @@ -578,46 +585,96 @@ void EditEntryWidget::removeCurrentAttribute() QModelIndex index = m_advancedUi->attributesView->currentIndex(); if (index.isValid()) { - m_entryAttributes->remove(m_attributesModel->keyByIndex(index)); + if (MessageBox::question(this, tr("Confirm Remove"), tr("Are you sure you want to remove this attribute?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + m_entryAttributes->remove(m_attributesModel->keyByIndex(index)); + } } } void EditEntryWidget::updateCurrentAttribute() { QModelIndex newIndex = m_advancedUi->attributesView->currentIndex(); + QString newKey = m_attributesModel->keyByIndex(newIndex); - if (m_history) { - if (newIndex.isValid()) { - QString key = m_attributesModel->keyByIndex(newIndex); - m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key)); - m_advancedUi->attributesEdit->setEnabled(true); + if (!m_history && m_currentAttribute != newIndex) { + // Save changes to the currently selected attribute if editing is enabled + if (m_currentAttribute.isValid() && m_advancedUi->attributesEdit->isEnabled()) { + QString currKey = m_attributesModel->keyByIndex(m_currentAttribute); + m_entryAttributes->set(currKey, m_advancedUi->attributesEdit->toPlainText(), + m_entryAttributes->isProtected(currKey)); + } + } + + displayAttribute(newIndex, m_entryAttributes->isProtected(newKey)); + + m_currentAttribute = newIndex; +} + +void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected) +{ + // Block signals to prevent extra calls + m_advancedUi->protectAttributeButton->blockSignals(true); + + if (index.isValid()) { + QString key = m_attributesModel->keyByIndex(index); + if (showProtected) { + m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED] Press reveal to view or edit")); + m_advancedUi->attributesEdit->setEnabled(false); + m_advancedUi->revealAttributeButton->setEnabled(true); + m_advancedUi->protectAttributeButton->setChecked(true); } else { - m_advancedUi->attributesEdit->setPlainText(""); - m_advancedUi->attributesEdit->setEnabled(false); + m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key)); + m_advancedUi->attributesEdit->setEnabled(true); + m_advancedUi->revealAttributeButton->setEnabled(false); + m_advancedUi->protectAttributeButton->setChecked(false); } + + // Don't allow editing in history view + m_advancedUi->protectAttributeButton->setEnabled(!m_history); + m_advancedUi->editAttributeButton->setEnabled(!m_history); + m_advancedUi->removeAttributeButton->setEnabled(!m_history); } else { - if (m_currentAttribute != newIndex) { - if (m_currentAttribute.isValid()) { - QString key = m_attributesModel->keyByIndex(m_currentAttribute); - m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(), - m_entryAttributes->isProtected(key)); - } + m_advancedUi->attributesEdit->setPlainText(""); + m_advancedUi->attributesEdit->setEnabled(false); + m_advancedUi->revealAttributeButton->setEnabled(false); + m_advancedUi->protectAttributeButton->setChecked(false); + m_advancedUi->protectAttributeButton->setEnabled(false); + m_advancedUi->editAttributeButton->setEnabled(false); + m_advancedUi->removeAttributeButton->setEnabled(false); + } - if (newIndex.isValid()) { - QString key = m_attributesModel->keyByIndex(newIndex); - m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key)); - m_advancedUi->attributesEdit->setEnabled(true); - } - else { - m_advancedUi->attributesEdit->setPlainText(""); - m_advancedUi->attributesEdit->setEnabled(false); - } + m_advancedUi->protectAttributeButton->blockSignals(false); +} - m_advancedUi->editAttributeButton->setEnabled(newIndex.isValid()); - m_advancedUi->removeAttributeButton->setEnabled(newIndex.isValid()); - m_currentAttribute = newIndex; +void EditEntryWidget::protectCurrentAttribute(bool state) +{ + QModelIndex index = m_advancedUi->attributesView->currentIndex(); + if (!m_history && index.isValid()) { + QString key = m_attributesModel->keyByIndex(index); + if (state) { + // Save the current text and protect the attribute + m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(), true); + } else { + // Unprotect the current attribute value (don't save text as it is obscured) + m_entryAttributes->set(key, m_entryAttributes->value(key), false); + } + + // Display the attribute + displayAttribute(index, state); + } +} + +void EditEntryWidget::revealCurrentAttribute() +{ + if (! m_advancedUi->attributesEdit->isEnabled()) { + QModelIndex index = m_advancedUi->attributesView->currentIndex(); + if (index.isValid()) { + QString key = m_attributesModel->keyByIndex(index); + m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key)); + m_advancedUi->attributesEdit->setEnabled(true); } } } @@ -730,8 +787,13 @@ void EditEntryWidget::removeCurrentAttachment() return; } - QString key = m_attachmentsModel->keyByIndex(index); - m_entryAttachments->remove(key); + QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Remove"), + tr("Are you sure you want to remove this attachment?"), + QMessageBox::Yes | QMessageBox::No); + if (ans == QMessageBox::Yes) { + QString key = m_attachmentsModel->keyByIndex(index); + m_entryAttachments->remove(key); + } } void EditEntryWidget::updateAutoTypeEnabled() diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index c8045d93c..4027dd11a 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -63,11 +63,11 @@ public: void clear(); bool hasBeenModified() const; -Q_SIGNALS: +signals: void editFinished(bool accepted); void historyEntryActivated(Entry* entry); -private Q_SLOTS: +private slots: void saveEntry(); void cancel(); void togglePasswordGeneratorButton(bool checked); @@ -76,6 +76,8 @@ private Q_SLOTS: void editCurrentAttribute(); void removeCurrentAttribute(); void updateCurrentAttribute(); + void protectCurrentAttribute(bool state); + void revealCurrentAttribute(); void insertAttachment(); void saveCurrentAttachment(); void openAttachment(const QModelIndex& index); @@ -110,6 +112,8 @@ private: QMenu* createPresetsMenu(); void updateEntryData(Entry* entry) const; + void displayAttribute(QModelIndex index, bool showProtected); + Entry* m_entry; Database* m_database; diff --git a/src/gui/entry/EditEntryWidgetAdvanced.ui b/src/gui/entry/EditEntryWidgetAdvanced.ui index 61380bb90..2c7f95dde 100644 --- a/src/gui/entry/EditEntryWidgetAdvanced.ui +++ b/src/gui/entry/EditEntryWidgetAdvanced.ui @@ -28,19 +28,50 @@ Additional attributes - + - - - - - + + + Qt::Horizontal + + false + + + + 0 + 0 + + + + QAbstractScrollArea::AdjustToContents + + + QListView::Adjust + + + + + false + + + + 0 + 0 + + + + + 170 + 0 + + + - + @@ -48,16 +79,6 @@ - - - - false - - - Edit - - - @@ -68,6 +89,16 @@ + + + + false + + + Edit Name + + + @@ -81,6 +112,35 @@ + + + + true + + + margin-left:50%;margin-right:50% + + + Protect + + + true + + + + + + + false + + + Reveal + + + false + + + @@ -103,7 +163,7 @@ - + @@ -172,11 +232,12 @@ attributesView attributesEdit addAttributeButton - editAttributeButton removeAttributeButton + editAttributeButton attachmentsView addAttachmentButton removeAttachmentButton + openAttachmentButton saveAttachmentButton diff --git a/src/gui/entry/EditEntryWidgetAutoType.ui b/src/gui/entry/EditEntryWidgetAutoType.ui index 21e102bfe..a8090f768 100644 --- a/src/gui/entry/EditEntryWidgetAutoType.ui +++ b/src/gui/entry/EditEntryWidgetAutoType.ui @@ -259,11 +259,6 @@ - - - - - diff --git a/src/gui/entry/EntryAttachmentsModel.cpp b/src/gui/entry/EntryAttachmentsModel.cpp index 39ed69f1f..082641380 100644 --- a/src/gui/entry/EntryAttachmentsModel.cpp +++ b/src/gui/entry/EntryAttachmentsModel.cpp @@ -97,7 +97,7 @@ QString EntryAttachmentsModel::keyByIndex(const QModelIndex& index) const void EntryAttachmentsModel::attachmentChange(const QString& key) { int row = m_entryAttachments->keys().indexOf(key); - Q_EMIT dataChanged(index(row, 0), index(row, columnCount()-1)); + emit dataChanged(index(row, 0), index(row, columnCount()-1)); } void EntryAttachmentsModel::attachmentAboutToAdd(const QString& key) diff --git a/src/gui/entry/EntryAttachmentsModel.h b/src/gui/entry/EntryAttachmentsModel.h index c2e238aeb..6abcdc2e2 100644 --- a/src/gui/entry/EntryAttachmentsModel.h +++ b/src/gui/entry/EntryAttachmentsModel.h @@ -34,7 +34,7 @@ public: QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QString keyByIndex(const QModelIndex& index) const; -private Q_SLOTS: +private slots: void attachmentChange(const QString& key); void attachmentAboutToAdd(const QString& key); void attachmentAdd(); diff --git a/src/gui/entry/EntryAttributesModel.cpp b/src/gui/entry/EntryAttributesModel.cpp index b22380ae8..1b1eab220 100644 --- a/src/gui/entry/EntryAttributesModel.cpp +++ b/src/gui/entry/EntryAttributesModel.cpp @@ -147,7 +147,7 @@ void EntryAttributesModel::attributeChange(const QString& key) { int row = m_attributes.indexOf(key); Q_ASSERT(row != -1); - Q_EMIT dataChanged(index(row, 0), index(row, columnCount()-1)); + emit dataChanged(index(row, 0), index(row, columnCount()-1)); } void EntryAttributesModel::attributeAboutToAdd(const QString& key) @@ -213,7 +213,7 @@ void EntryAttributesModel::attributeRename(const QString& oldKey, const QString& m_nextRenameDataChange = false; QModelIndex keyIndex = index(m_attributes.indexOf(newKey), 0); - Q_EMIT dataChanged(keyIndex, keyIndex); + emit dataChanged(keyIndex, keyIndex); } } diff --git a/src/gui/entry/EntryAttributesModel.h b/src/gui/entry/EntryAttributesModel.h index 1eec8bff7..7d613c1f0 100644 --- a/src/gui/entry/EntryAttributesModel.h +++ b/src/gui/entry/EntryAttributesModel.h @@ -38,7 +38,7 @@ public: QModelIndex indexByKey(const QString& key) const; QString keyByIndex(const QModelIndex& index) const; -private Q_SLOTS: +private slots: void attributeChange(const QString& key); void attributeAboutToAdd(const QString& key); void attributeAdd(); diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index d606a777e..b28eaed46 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "core/DatabaseIcons.h" #include "core/Entry.h" @@ -63,7 +64,7 @@ void EntryModel::setGroup(Group* group) makeConnections(group); endResetModel(); - Q_EMIT switchedToGroupMode(); + emit switchedToGroupMode(); } void EntryModel::setEntryList(const QList& entries) @@ -100,7 +101,7 @@ void EntryModel::setEntryList(const QList& entries) } endResetModel(); - Q_EMIT switchedToEntryListMode(); + emit switchedToEntryListMode(); } int EntryModel::rowCount(const QModelIndex& parent) const @@ -127,8 +128,10 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } Entry* entry = entryFromIndex(index); + EntryAttributes* attr = entry->attributes(); if (role == Qt::DisplayRole) { + QString result; switch (index.column()) { case ParentGroup: if (entry->group()) { @@ -136,11 +139,23 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } break; case Title: - return entry->title(); + result = entry->resolvePlaceholder(entry->title()); + if (attr->isReference(EntryAttributes::TitleKey)) { + result.prepend(tr("Ref: ","Reference abbreviation")); + } + return result; case Username: - return entry->username(); + result = entry->resolvePlaceholder(entry->username()); + if (attr->isReference(EntryAttributes::UserNameKey)) { + result.prepend(tr("Ref: ","Reference abbreviation")); + } + return result; case Url: - return entry->url(); + result = entry->resolvePlaceholder(entry->url()); + if (attr->isReference(EntryAttributes::URLKey)) { + result.prepend(tr("Ref: ","Reference abbreviation")); + } + return result; } } else if (role == Qt::DecorationRole) { @@ -166,6 +181,12 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } return font; } + else if (role == Qt::TextColorRole) { + if (entry->hasReferences()) { + QPalette p; + return QVariant(p.color(QPalette::Active, QPalette::Mid)); + } + } return QVariant(); } @@ -294,7 +315,7 @@ void EntryModel::entryRemoved() void EntryModel::entryDataChanged(Entry* entry) { int row = m_entries.indexOf(entry); - Q_EMIT dataChanged(index(row, 0), index(row, columnCount()-1)); + emit dataChanged(index(row, 0), index(row, columnCount()-1)); } void EntryModel::severConnections() diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 0183c47be..d12982d83 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -52,14 +52,14 @@ public: void setEntryList(const QList& entries); -Q_SIGNALS: +signals: void switchedToEntryListMode(); void switchedToGroupMode(); -public Q_SLOTS: +public slots: void setGroup(Group* group); -private Q_SLOTS: +private slots: void entryAboutToAdd(Entry* entry); void entryAdded(Entry* entry); void entryAboutToRemove(Entry* entry); diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 31fae3e58..1bdd4fbcf 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -57,7 +57,7 @@ void EntryView::keyPressEvent(QKeyEvent* event) emitEntryActivated(currentIndex()); #ifdef Q_OS_MAC // Pressing return does not emit the QTreeView::activated signal on mac os - Q_EMIT activated(currentIndex()); + emit activated(currentIndex()); #endif } @@ -83,7 +83,7 @@ void EntryView::setFirstEntryActive() setCurrentEntry(m_model->entryFromIndex(index)); } else { - Q_EMIT entrySelectionChanged(); + emit entrySelectionChanged(); } } @@ -96,7 +96,7 @@ void EntryView::emitEntryActivated(const QModelIndex& index) { Entry* entry = entryFromIndex(index); - Q_EMIT entryActivated(entry, static_cast(m_sortModel->mapToSource(index).column())); + emit entryActivated(entry, static_cast(m_sortModel->mapToSource(index).column())); } void EntryView::setModel(QAbstractItemModel* model) diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index fb9e3566a..6a545f62a 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -42,17 +42,17 @@ public: int numberOfSelectedEntries(); void setFirstEntryActive(); -public Q_SLOTS: +public slots: void setGroup(Group* group); -Q_SIGNALS: +signals: void entryActivated(Entry* entry, EntryModel::ModelColumn column); void entrySelectionChanged(); protected: void keyPressEvent(QKeyEvent* event) override; -private Q_SLOTS: +private slots: void emitEntryActivated(const QModelIndex& index); void switchToEntryListMode(); void switchToGroupMode(); diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp index ac4e4ce99..4f2e9fec5 100644 --- a/src/gui/group/EditGroupWidget.cpp +++ b/src/gui/group/EditGroupWidget.cpp @@ -130,7 +130,7 @@ void EditGroupWidget::save() } clear(); - Q_EMIT editFinished(true); + emit editFinished(true); } void EditGroupWidget::cancel() @@ -141,7 +141,7 @@ void EditGroupWidget::cancel() } clear(); - Q_EMIT editFinished(false); + emit editFinished(false); } void EditGroupWidget::clear() diff --git a/src/gui/group/EditGroupWidget.h b/src/gui/group/EditGroupWidget.h index 606cc77b0..39f2c09b0 100644 --- a/src/gui/group/EditGroupWidget.h +++ b/src/gui/group/EditGroupWidget.h @@ -43,12 +43,12 @@ public: void loadGroup(Group* group, bool create, Database* database); void clear(); -Q_SIGNALS: +signals: void editFinished(bool accepted); void messageEditEntry(QString, MessageWidget::MessageType); void messageEditEntryDismiss(); -private Q_SLOTS: +private slots: void save(); void cancel(); diff --git a/src/gui/group/GroupModel.cpp b/src/gui/group/GroupModel.cpp index 5aafc1a79..87eacf275 100644 --- a/src/gui/group/GroupModel.cpp +++ b/src/gui/group/GroupModel.cpp @@ -365,7 +365,7 @@ QMimeData* GroupModel::mimeData(const QModelIndexList& indexes) const void GroupModel::groupDataChanged(Group* group) { QModelIndex ix = index(group); - Q_EMIT dataChanged(ix, ix); + emit dataChanged(ix, ix); } void GroupModel::groupAboutToRemove(Group* group) diff --git a/src/gui/group/GroupModel.h b/src/gui/group/GroupModel.h index 0ef0ba990..899aa3fd1 100644 --- a/src/gui/group/GroupModel.h +++ b/src/gui/group/GroupModel.h @@ -49,7 +49,7 @@ public: private: QModelIndex parent(Group* group) const; -private Q_SLOTS: +private slots: void groupDataChanged(Group* group); void groupAboutToRemove(Group* group); void groupRemoved(); diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp index 18f7de804..e9649e441 100644 --- a/src/gui/group/GroupView.cpp +++ b/src/gui/group/GroupView.cpp @@ -112,7 +112,7 @@ void GroupView::expandGroup(Group* group, bool expand) void GroupView::emitGroupChanged(const QModelIndex& index) { - Q_EMIT groupChanged(m_model->groupFromIndex(index)); + emit groupChanged(m_model->groupFromIndex(index)); } void GroupView::setModel(QAbstractItemModel* model) @@ -123,7 +123,7 @@ void GroupView::setModel(QAbstractItemModel* model) void GroupView::emitGroupChanged() { - Q_EMIT groupChanged(currentGroup()); + emit groupChanged(currentGroup()); } void GroupView::syncExpandedState(const QModelIndex& parent, int start, int end) diff --git a/src/gui/group/GroupView.h b/src/gui/group/GroupView.h index 69ca82817..eaa290725 100644 --- a/src/gui/group/GroupView.h +++ b/src/gui/group/GroupView.h @@ -36,10 +36,10 @@ public: void setCurrentGroup(Group* group); void expandGroup(Group* group, bool expand = true); -Q_SIGNALS: +signals: void groupChanged(Group* group); -private Q_SLOTS: +private slots: void expandedChanged(const QModelIndex& index); void emitGroupChanged(const QModelIndex& index); void emitGroupChanged(); diff --git a/src/http/AccessControlDialog.cpp b/src/http/AccessControlDialog.cpp index 60422be4f..4d21aa95c 100644 --- a/src/http/AccessControlDialog.cpp +++ b/src/http/AccessControlDialog.cpp @@ -34,10 +34,11 @@ void AccessControlDialog::setUrl(const QString &url) "Please select whether you want to allow access.")).arg(QUrl(url).host())); } -void AccessControlDialog::setItems(const QList &items) +void AccessControlDialog::setItems(const QList &items) { - Q_FOREACH (Entry * entry, items) + for (Entry* entry: items) { ui->itemsList->addItem(entry->title() + " - " + entry->username()); + } } bool AccessControlDialog::remember() const diff --git a/src/http/HttpPasswordGeneratorWidget.h b/src/http/HttpPasswordGeneratorWidget.h index f8e35c232..f9907600b 100644 --- a/src/http/HttpPasswordGeneratorWidget.h +++ b/src/http/HttpPasswordGeneratorWidget.h @@ -38,7 +38,7 @@ public: void saveSettings(); void reset(); -private Q_SLOTS: +private slots: void sliderMoved(); void spinBoxChanged(); diff --git a/src/http/OptionDialog.h b/src/http/OptionDialog.h index 1b1819159..ad535fdb8 100644 --- a/src/http/OptionDialog.h +++ b/src/http/OptionDialog.h @@ -29,11 +29,11 @@ public: explicit OptionDialog(QWidget *parent = nullptr); ~OptionDialog(); -public Q_SLOTS: +public slots: void loadSettings(); void saveSettings(); -Q_SIGNALS: +signals: void removeSharedEncryptionKeys(); void removeStoredPermissions(); diff --git a/src/http/Protocol.cpp b/src/http/Protocol.cpp index bcb30f0b1..7b37013f8 100644 --- a/src/http/Protocol.cpp +++ b/src/http/Protocol.cpp @@ -17,6 +17,7 @@ #include "crypto/Random.h" #include "crypto/SymmetricCipher.h" #include "crypto/SymmetricCipherGcrypt.h" +#include "core/Global.h" namespace KeepassHttpProtocol { @@ -370,8 +371,9 @@ QVariant Response::getEntries() const QList res; res.reserve(m_entries.size()); - Q_FOREACH (const Entry &entry, m_entries) + for (const Entry& entry: asConst(m_entries)) { res.append(qobject2qvariant(&entry)); + } return res; } @@ -383,14 +385,16 @@ void Response::setEntries(const QList &entries) QList encryptedEntries; encryptedEntries.reserve(m_count); - Q_FOREACH (const Entry &entry, entries) { + for (const Entry& entry: entries) { Entry encryptedEntry(encrypt(entry.name(), m_cipher), encrypt(entry.login(), m_cipher), entry.password().isNull() ? QString() : encrypt(entry.password(), m_cipher), encrypt(entry.uuid(), m_cipher)); - Q_FOREACH (const StringField & field, entry.stringFields()) + const auto stringFields = entry.stringFields(); + for (const StringField& field: stringFields) { encryptedEntry.addStringField(encrypt(field.key(), m_cipher), encrypt(field.value(), m_cipher)); + } encryptedEntries << encryptedEntry; } m_entries = encryptedEntries; @@ -508,8 +512,9 @@ QVariant Entry::getStringFields() const QList res; res.reserve(m_stringFields.size()); - Q_FOREACH (const StringField &stringfield, m_stringFields) + for (const StringField& stringfield: asConst(m_stringFields)) { res.append(qobject2qvariant(&stringfield)); + } return res; } diff --git a/src/http/Service.cpp b/src/http/Service.cpp index 1a89b7328..25c69f614 100644 --- a/src/http/Service.cpp +++ b/src/http/Service.cpp @@ -23,12 +23,15 @@ #include "core/Database.h" #include "core/Entry.h" +#include "core/Global.h" #include "core/Group.h" #include "core/EntrySearcher.h" #include "core/Metadata.h" #include "core/Uuid.h" #include "core/PasswordGenerator.h" +#include + static const unsigned char KEEPASSHTTP_UUID_DATA[] = { 0x34, 0x69, 0x7a, 0x40, 0x8a, 0x5b, 0x41, 0xc0, 0x9f, 0x36, 0x89, 0x7d, 0x62, 0x3e, 0xcb, 0x31 @@ -187,8 +190,9 @@ bool Service::removeFirstDomain(QString & hostname) QList Service::searchEntries(Database* db, const QString& hostname) { QList entries; - if (Group* rootGroup = db->rootGroup()) - Q_FOREACH (Entry* entry, EntrySearcher().search(hostname, rootGroup, Qt::CaseInsensitive)) { + if (Group* rootGroup = db->rootGroup()) { + const auto results = EntrySearcher().search(hostname, rootGroup, Qt::CaseInsensitive); + for (Entry* entry: results) { QString title = entry->title(); QString url = entry->url(); @@ -199,6 +203,7 @@ QList Service::searchEntries(Database* db, const QString& hostname) || (matchUrlScheme(url) && hostname.endsWith(QUrl(url).host())) ) entries.append(entry); } + } return entries; } @@ -221,8 +226,9 @@ QList Service::searchEntries(const QString& text) QString hostname = QUrl(text).host(); QList entries; do { - Q_FOREACH (Database* db, databases) + for (Database* db: asConst(databases)) { entries << searchEntries(db, hostname); + } } while(entries.isEmpty() && removeFirstDomain(hostname)); return entries; @@ -247,9 +253,12 @@ KeepassHttpProtocol::Entry Service::prepareEntry(const Entry* entry) KeepassHttpProtocol::Entry res(entry->resolvePlaceholder(entry->title()), entry->resolvePlaceholder(entry->username()), entry->resolvePlaceholder(entry->password()), entry->uuid().toHex()); if (HttpSettings::supportKphFields()) { const EntryAttributes * attr = entry->attributes(); - Q_FOREACH (const QString& key, attr->keys()) - if (key.startsWith(QLatin1String("KPH: "))) + const auto keys = attr->keys(); + for (const QString& key: keys) { + if (key.startsWith(QLatin1String("KPH: "))) { res.addStringField(key, attr->value(key)); + } + } } return res; } @@ -316,7 +325,8 @@ QList Service::findMatchingEntries(const QString& /* //Check entries for authorization QList pwEntriesToConfirm; QList pwEntries; - Q_FOREACH (Entry * entry, searchEntries(url)) { + const auto entries = searchEntries(url); + for (Entry* entry: entries) { switch(checkAccess(entry, host, submitHost, realm)) { case Denied: continue; @@ -350,7 +360,7 @@ QList Service::findMatchingEntries(const QString& /* int res = dlg.exec(); if (dlg.remember()) { - Q_FOREACH (Entry * entry, pwEntriesToConfirm) { + for (Entry* entry: asConst(pwEntriesToConfirm)) { EntryConfig config; config.load(entry); if (res == QDialog::Accepted) { @@ -381,28 +391,22 @@ QList Service::findMatchingEntries(const QString& /* const QString baseSubmitURL = url.toString(QUrl::StripTrailingSlash | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); //Cache priorities - QHash priorities; + QHash priorities; priorities.reserve(pwEntries.size()); - Q_FOREACH (const Entry * entry, pwEntries) + for (const Entry* entry: asConst(pwEntries)) { priorities.insert(entry, sortPriority(entry, host, submitUrl, baseSubmitURL)); + } //Sort by priorities - qSort(pwEntries.begin(), pwEntries.end(), SortEntries(priorities, HttpSettings::sortByTitle() ? "Title" : "UserName")); + std::sort(pwEntries.begin(), pwEntries.end(), SortEntries(priorities, HttpSettings::sortByTitle() ? "Title" : "UserName")); } - //if (pwEntries.count() > 0) - //{ - // var names = (from e in resp.Entries select e.Name).Distinct(); - // var n = String.Join("\n ", names.ToArray()); - // if (HttpSettings::receiveCredentialNotification()) - // ShowNotification(QString("%0: %1 is receiving credentials for:\n%2").arg(Id).arg(host).arg(n))); - //} - //Fill the list QList result; result.reserve(pwEntries.count()); - Q_FOREACH (Entry * entry, pwEntries) + for (Entry* entry: asConst(pwEntries)) { result << prepareEntry(entry); + } return result; } @@ -414,12 +418,19 @@ int Service::countMatchingEntries(const QString &, const QString &url, const QSt QList Service::searchAllEntries(const QString &) { QList result; - if (DatabaseWidget * dbWidget = m_dbTabWidget->currentDatabaseWidget()) - if (Database * db = dbWidget->database()) - if (Group * rootGroup = db->rootGroup()) - Q_FOREACH (Entry * entry, rootGroup->entriesRecursive()) - if (!entry->url().isEmpty() || QUrl(entry->title()).isValid()) - result << KeepassHttpProtocol::Entry(entry->title(), entry->username(), QString(), entry->uuid().toHex()); + if (DatabaseWidget* dbWidget = m_dbTabWidget->currentDatabaseWidget()) { + if (Database* db = dbWidget->database()) { + if (Group* rootGroup = db->rootGroup()) { + const auto entries = rootGroup->entriesRecursive(); + for (Entry* entry: entries) { + if (!entry->url().isEmpty() || QUrl(entry->title()).isValid()) { + result << KeepassHttpProtocol::Entry(entry->title(), entry->username(), + QString(), entry->uuid().toHex()); + } + } + } + } + } return result; } @@ -428,11 +439,15 @@ Group * Service::findCreateAddEntryGroup() if (DatabaseWidget * dbWidget = m_dbTabWidget->currentDatabaseWidget()) if (Database * db = dbWidget->database()) if (Group * rootGroup = db->rootGroup()) { - const QString groupName = QLatin1String(KEEPASSHTTP_GROUP_NAME);//TODO: setting to decide where new keys are created + //TODO: setting to decide where new keys are created + const QString groupName = QLatin1String(KEEPASSHTTP_GROUP_NAME); - Q_FOREACH (const Group * g, rootGroup->groupsRecursive(true)) - if (g->name() == groupName) + const auto groups = rootGroup->groupsRecursive(true); + for (const Group * g: groups) { + if (g->name() == groupName) { return db->resolveGroup(g->uuid()); + } + } Group * group; group = new Group(); @@ -505,14 +520,18 @@ void Service::removeSharedEncryptionKeys() QMessageBox::Ok); } else if (Entry* entry = getConfigEntry()) { QStringList keysToRemove; - Q_FOREACH (const QString& key, entry->attributes()->keys()) - if (key.startsWith(ASSOCIATE_KEY_PREFIX)) + const auto keys = entry->attributes()->keys(); + for (const QString& key: keys) { + if (key.startsWith(ASSOCIATE_KEY_PREFIX)) { keysToRemove << key; + } + } if(keysToRemove.count()) { entry->beginUpdate(); - Q_FOREACH (const QString& key, keysToRemove) + for (const QString& key: asConst(keysToRemove)) { entry->attributes()->remove(key); + } entry->endUpdate(); const int count = keysToRemove.count(); @@ -546,7 +565,7 @@ void Service::removeStoredPermissions() progress.setWindowModality(Qt::WindowModal); uint counter = 0; - Q_FOREACH (Entry* entry, entries) { + for (Entry* entry: asConst(entries)) { if (progress.wasCanceled()) return; if (entry->attributes()->contains(KEEPASSHTTP_NAME)) { diff --git a/src/http/Service.h b/src/http/Service.h index 6452d605a..b6ee5bea0 100644 --- a/src/http/Service.h +++ b/src/http/Service.h @@ -38,7 +38,7 @@ public: virtual void updateEntry(const QString& id, const QString& uuid, const QString& login, const QString& password, const QString& url); virtual QString generatePassword(); -public Q_SLOTS: +public slots: void removeSharedEncryptionKeys(); void removeStoredPermissions(); diff --git a/src/streams/LayeredStream.h b/src/streams/LayeredStream.h index 8586b4134..4ca7aba9a 100644 --- a/src/streams/LayeredStream.h +++ b/src/streams/LayeredStream.h @@ -37,7 +37,7 @@ protected: QIODevice* const m_baseDevice; -private Q_SLOTS: +private slots: void closeStream(); }; diff --git a/src/zxcvbn/zxcvbn.cpp b/src/zxcvbn/zxcvbn.cpp index c999adfae..52c0bb1f3 100644 --- a/src/zxcvbn/zxcvbn.cpp +++ b/src/zxcvbn/zxcvbn.cpp @@ -1,4 +1,4 @@ -/********************************************************************************** +/********************************************************************************** * C implementation of the zxcvbn password strength estimation method. * Copyright (c) 2015, Tony Evans * All rights reserved. diff --git a/src/zxcvbn/zxcvbn.h b/src/zxcvbn/zxcvbn.h index 2d3ec52c1..796d6b47b 100644 --- a/src/zxcvbn/zxcvbn.h +++ b/src/zxcvbn/zxcvbn.h @@ -1,4 +1,4 @@ -#ifndef ZXCVBN_H_F98183CE2A01_INCLUDED +#ifndef ZXCVBN_H_F98183CE2A01_INCLUDED #define ZXCVBN_H_F98183CE2A01_INCLUDED /********************************************************************************** * C implementation of the zxcvbn password strength estimation method. diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h index c585fec25..569bc8c70 100644 --- a/tests/TestAutoType.h +++ b/tests/TestAutoType.h @@ -31,7 +31,7 @@ class TestAutoType : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void init(); void cleanup(); diff --git a/tests/TestCryptoHash.h b/tests/TestCryptoHash.h index 05700f349..d31501bae 100644 --- a/tests/TestCryptoHash.h +++ b/tests/TestCryptoHash.h @@ -24,7 +24,7 @@ class TestCryptoHash : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void test(); }; diff --git a/tests/TestCsvExporter.h b/tests/TestCsvExporter.h index a8cfe7f25..39597f752 100644 --- a/tests/TestCsvExporter.h +++ b/tests/TestCsvExporter.h @@ -31,7 +31,7 @@ class TestCsvExporter : public QObject public: static const QString ExpectedHeaderLine; -private Q_SLOTS: +private slots: void init(); void initTestCase(); void cleanup(); diff --git a/tests/TestDeletedObjects.h b/tests/TestDeletedObjects.h index 27b70cced..d96452093 100644 --- a/tests/TestDeletedObjects.h +++ b/tests/TestDeletedObjects.h @@ -29,7 +29,7 @@ class TestDeletedObjects : public QObject private: void createAndDelete(Database* db, int delObjectsSize); -private Q_SLOTS: +private slots: void initTestCase(); void testDeletedObjectsFromFile(); void testDeletedObjectsFromNewDb(); diff --git a/tests/TestEntry.h b/tests/TestEntry.h index ed772d505..0c97c0b9d 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -26,7 +26,7 @@ class TestEntry : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testHistoryItemDeletion(); void testCopyDataFrom(); diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index d5a16ebab..e0c8bb490 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -181,6 +181,12 @@ void TestEntryModel::testAttributesModel() QCOMPARE(spyAboutToRemove.count(), 1); QCOMPARE(spyRemoved.count(), 1); + // test attribute protection + QString value = entryAttributes->value("2nd"); + entryAttributes->set("2nd", value, true); + QVERIFY(entryAttributes->isProtected("2nd")); + QCOMPARE(entryAttributes->value("2nd"), value); + QSignalSpy spyReset(model, SIGNAL(modelReset())); entryAttributes->clear(); model->setEntryAttributes(0); diff --git a/tests/TestEntryModel.h b/tests/TestEntryModel.h index 778392f20..df80331e8 100644 --- a/tests/TestEntryModel.h +++ b/tests/TestEntryModel.h @@ -24,7 +24,7 @@ class TestEntryModel : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void test(); void testAttachmentsModel(); diff --git a/tests/TestEntrySearcher.h b/tests/TestEntrySearcher.h index 7c45451dc..3965c22e0 100644 --- a/tests/TestEntrySearcher.h +++ b/tests/TestEntrySearcher.h @@ -28,7 +28,7 @@ class TestEntrySearcher : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void cleanupTestCase(); diff --git a/tests/TestExporter.h b/tests/TestExporter.h index 15f9a7c33..8c9945252 100644 --- a/tests/TestExporter.h +++ b/tests/TestExporter.h @@ -25,7 +25,7 @@ class TestExporter : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testToDbExporter(); }; diff --git a/tests/TestGroup.h b/tests/TestGroup.h index 4a891ae6f..c9ed8f087 100644 --- a/tests/TestGroup.h +++ b/tests/TestGroup.h @@ -25,7 +25,7 @@ class TestGroup : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testParenting(); void testSignals(); diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp index 3608cc475..1faf82aa2 100644 --- a/tests/TestGroupModel.cpp +++ b/tests/TestGroupModel.cpp @@ -131,7 +131,7 @@ void TestGroupModel::test() QCOMPARE(spyMoved.count(), 3); QVERIFY(index12.isValid()); QCOMPARE(model->data(index12).toString(), QString("group12")); - QCOMPARE(model->data(index12.child(0, 0)).toString(), QString("group121")); + QCOMPARE(model->data(index12.model()->index(0, 0, index12)).toString(), QString("group121")); delete group12; QCOMPARE(spyAboutToAdd.count(), 1); diff --git a/tests/TestGroupModel.h b/tests/TestGroupModel.h index 093af9e0f..1b5c0ab46 100644 --- a/tests/TestGroupModel.h +++ b/tests/TestGroupModel.h @@ -24,7 +24,7 @@ class TestGroupModel : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void test(); }; diff --git a/tests/TestHashedBlockStream.h b/tests/TestHashedBlockStream.h index 9aeac1411..6c36f8e6a 100644 --- a/tests/TestHashedBlockStream.h +++ b/tests/TestHashedBlockStream.h @@ -24,7 +24,7 @@ class TestHashedBlockStream : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testWriteRead(); void testReset(); diff --git a/tests/TestKeePass1Reader.h b/tests/TestKeePass1Reader.h index 20acd4bb9..9a5ab9e49 100644 --- a/tests/TestKeePass1Reader.h +++ b/tests/TestKeePass1Reader.h @@ -27,7 +27,7 @@ class TestKeePass1Reader : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testBasic(); void testMasterKey(); diff --git a/tests/TestKeePass2RandomStream.h b/tests/TestKeePass2RandomStream.h index b001a05a2..967ed9c9e 100644 --- a/tests/TestKeePass2RandomStream.h +++ b/tests/TestKeePass2RandomStream.h @@ -24,7 +24,7 @@ class TestKeePass2RandomStream : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void test(); }; diff --git a/tests/TestKeePass2Reader.h b/tests/TestKeePass2Reader.h index 6f090de38..76ffe0297 100644 --- a/tests/TestKeePass2Reader.h +++ b/tests/TestKeePass2Reader.h @@ -24,7 +24,7 @@ class TestKeePass2Reader : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testNonAscii(); void testCompressed(); diff --git a/tests/TestKeePass2Writer.h b/tests/TestKeePass2Writer.h index 822883823..36a51dce6 100644 --- a/tests/TestKeePass2Writer.h +++ b/tests/TestKeePass2Writer.h @@ -26,7 +26,7 @@ class TestKeePass2Writer : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testBasic(); void testProtectedAttributes(); diff --git a/tests/TestKeePass2XmlReader.h b/tests/TestKeePass2XmlReader.h index ff83e2597..628964b46 100644 --- a/tests/TestKeePass2XmlReader.h +++ b/tests/TestKeePass2XmlReader.h @@ -27,7 +27,7 @@ class TestKeePass2XmlReader : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testMetadata(); void testCustomIcons(); diff --git a/tests/TestKeys.h b/tests/TestKeys.h index a6d0b7e1a..683f07683 100644 --- a/tests/TestKeys.h +++ b/tests/TestKeys.h @@ -24,7 +24,7 @@ class TestKeys : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testComposite(); void testCompositeKeyReadFromLine(); diff --git a/tests/TestModified.h b/tests/TestModified.h index ee598addf..518bea7c0 100644 --- a/tests/TestModified.h +++ b/tests/TestModified.h @@ -24,7 +24,7 @@ class TestModified : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testSignals(); void testGroupSets(); diff --git a/tests/TestRandom.h b/tests/TestRandom.h index c879f9450..323d6b613 100644 --- a/tests/TestRandom.h +++ b/tests/TestRandom.h @@ -38,7 +38,7 @@ class TestRandom : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testUInt(); void testUIntRange(); diff --git a/tests/TestSymmetricCipher.h b/tests/TestSymmetricCipher.h index 17fa77a49..8259af620 100644 --- a/tests/TestSymmetricCipher.h +++ b/tests/TestSymmetricCipher.h @@ -24,7 +24,7 @@ class TestSymmetricCipher : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testAes256CbcEncryption(); void testAes256CbcDecryption(); diff --git a/tests/TestWildcardMatcher.h b/tests/TestWildcardMatcher.h index c241c7553..e23770937 100644 --- a/tests/TestWildcardMatcher.h +++ b/tests/TestWildcardMatcher.h @@ -26,7 +26,7 @@ class TestWildcardMatcher : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void testMatcher(); void testMatcher_data(); diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 3893038ba..7df5942e8 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -242,6 +243,19 @@ void TestGui::testEditEntry() QLineEdit* titleEdit = editEntryWidget->findChild("titleEdit"); QTest::keyClicks(titleEdit, "_test"); + // Test protected attributes + editEntryWidget->setCurrentPage(1); + QPlainTextEdit* attrTextEdit = editEntryWidget->findChild("attributesEdit"); + QTest::mouseClick(editEntryWidget->findChild("addAttributeButton"), Qt::LeftButton); + QString attrText = "TEST TEXT"; + QTest::keyClicks(attrTextEdit, attrText); + QCOMPARE(attrTextEdit->toPlainText(), attrText); + QTest::mouseClick(editEntryWidget->findChild("protectAttributeButton"), Qt::LeftButton); + QVERIFY(attrTextEdit->toPlainText().contains("PROTECTED")); + QTest::mouseClick(editEntryWidget->findChild("revealAttributeButton"), Qt::LeftButton); + QCOMPARE(attrTextEdit->toPlainText(), attrText); + editEntryWidget->setCurrentPage(0); + // Save the edit QDialogButtonBox* editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index c2e0e372e..1ae297005 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -33,7 +33,7 @@ class TestGui : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void init(); void cleanup(); diff --git a/tests/gui/TestGuiPixmaps.h b/tests/gui/TestGuiPixmaps.h index ef0b664b5..6e649c0f7 100644 --- a/tests/gui/TestGuiPixmaps.h +++ b/tests/gui/TestGuiPixmaps.h @@ -26,7 +26,7 @@ class TestGuiPixmaps : public QObject { Q_OBJECT -private Q_SLOTS: +private slots: void initTestCase(); void testDatabaseIcons(); void testEntryIcons(); diff --git a/tests/modeltest.h b/tests/modeltest.h index 3dcf18ceb..fdc5cf2f6 100644 --- a/tests/modeltest.h +++ b/tests/modeltest.h @@ -46,7 +46,7 @@ class ModelTest : public QObject public: ModelTest( QAbstractItemModel *model, QObject *parent = 0 ); -private Q_SLOTS: +private slots: void nonDestructiveBasicTest(); void rowCount(); void columnCount(); @@ -55,7 +55,7 @@ private Q_SLOTS: void parent(); void data(); -protected Q_SLOTS: +protected slots: void runAllTests(); void layoutAboutToBeChanged(); void layoutChanged();