diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt index 0dde0fecf..47fcc3f7b 100644 --- a/share/CMakeLists.txt +++ b/share/CMakeLists.txt @@ -19,6 +19,9 @@ add_subdirectory(translations) file(GLOB wordlists_files "wordlists/*.wordlist") install(FILES ${wordlists_files} DESTINATION ${DATA_INSTALL_DIR}/wordlists) +# Copy wordlists to build dir for use in tests +file(COPY "wordlists" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + if(UNIX AND NOT APPLE AND NOT HAIKU) install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor FILES_MATCHING PATTERN "keepassx*.png" PATTERN "keepassx*.svg" diff --git a/src/core/Resources.cpp b/src/core/Resources.cpp index 799475bb1..ad1ff5fa0 100644 --- a/src/core/Resources.cpp +++ b/src/core/Resources.cpp @@ -224,19 +224,18 @@ Resources::Resources() { const QString appDirPath = QCoreApplication::applicationDirPath(); #if defined(Q_OS_UNIX) && !(defined(Q_OS_MACOS) && defined(WITH_APP_BUNDLE)) - testResourceDir(KEEPASSX_DATA_DIR) || testResourceDir(QStringLiteral("%1/../%2").arg(appDirPath, KEEPASSX_DATA_DIR)) - || testResourceDir(QStringLiteral("%1/%2").arg(KEEPASSX_PREFIX_DIR, KEEPASSX_DATA_DIR)); + trySetResourceDir(KEEPASSX_DATA_DIR) || trySetResourceDir(QString("%1/../%2").arg(appDirPath, KEEPASSX_DATA_DIR)) + || trySetResourceDir(QString("%1/%2").arg(KEEPASSX_PREFIX_DIR, KEEPASSX_DATA_DIR)); #elif defined(Q_OS_MACOS) && defined(WITH_APP_BUNDLE) - testResourceDir(appDirPath + QStringLiteral("/../Resources")); + trySetResourceDir(appDirPath + QStringLiteral("/../Resources")); #elif defined(Q_OS_WIN) - testResourceDir(appDirPath + QStringLiteral("/share")); + trySetResourceDir(appDirPath + QStringLiteral("/share")); #endif if (m_dataPath.isEmpty()) { // Last ditch check if we are running from inside the src or test build directory - testResourceDir(appDirPath + QStringLiteral("/../../share")) - || testResourceDir(appDirPath + QStringLiteral("/../share")) - || testResourceDir(appDirPath + QStringLiteral("/../../../share")); + trySetResourceDir(appDirPath + QStringLiteral("/../share")) + || trySetResourceDir(appDirPath + QStringLiteral("/../../share")); } if (m_dataPath.isEmpty()) { @@ -244,10 +243,11 @@ Resources::Resources() } } -bool Resources::testResourceDir(const QString& dir) +bool Resources::trySetResourceDir(const QString& path) { - if (QFile::exists(dir + QStringLiteral("/icons/application/256x256/apps/keepassxc.png"))) { - m_dataPath = QDir::cleanPath(dir); + QDir dir(path); + if (dir.exists()) { + m_dataPath = dir.canonicalPath(); return true; } return false; diff --git a/src/core/Resources.h b/src/core/Resources.h index 8f60f5955..b76818150 100644 --- a/src/core/Resources.h +++ b/src/core/Resources.h @@ -42,7 +42,7 @@ public: private: Resources(); - bool testResourceDir(const QString& dir); + bool trySetResourceDir(const QString& path); static Resources* m_instance; diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp index e90d63837..ff7dafde5 100644 --- a/src/core/Translator.cpp +++ b/src/core/Translator.cpp @@ -49,22 +49,9 @@ void Translator::installTranslators() // Always try to load english last languages << "en_US"; - const QStringList paths = { -#ifdef QT_DEBUG - QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR), -#endif - resources()->dataPath("translations")}; - - bool translationsLoaded = false; - for (const QString& path : paths) { - installQtTranslator(languages, path); - if (installTranslator(languages, path)) { - translationsLoaded = true; - break; - } - } - - if (!translationsLoaded) { + const auto path = resources()->dataPath("translations"); + installQtTranslator(languages, path); + if (!installTranslator(languages, path)) { // couldn't load configured language or fallback qWarning("Couldn't load translations."); } @@ -117,40 +104,31 @@ bool Translator::installQtTranslator(const QStringList& languages, const QString */ QList> Translator::availableLanguages() { - const QStringList paths = { -#ifdef QT_DEBUG - QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR), -#endif - resources()->dataPath("translations")}; - QList> languages; languages.append(QPair("system", "System default")); QRegularExpression regExp("^keepassx_([a-zA-Z_]+)\\.qm$", QRegularExpression::CaseInsensitiveOption); - for (const QString& path : paths) { - const QStringList fileList = QDir(path).entryList(); - for (const QString& filename : fileList) { - QRegularExpressionMatch match = regExp.match(filename); - if (match.hasMatch()) { - QString langcode = match.captured(1); - if (langcode == "en") { - continue; - } - - QLocale locale(langcode); - QString languageStr = QLocale::languageToString(locale.language()); - if (langcode == "la") { - // langcode "la" (Latin) is translated into "C" by QLocale::languageToString() - languageStr = "Latin"; - } - QString countryStr; - if (langcode.contains("_")) { - countryStr = QString(" (%1)").arg(QLocale::countryToString(locale.country())); - } - - QPair language(langcode, languageStr + countryStr); - languages.append(language); + const QStringList fileList = QDir(resources()->dataPath("translations")).entryList(); + for (const QString& filename : fileList) { + QRegularExpressionMatch match = regExp.match(filename); + if (match.hasMatch()) { + QString langcode = match.captured(1); + if (langcode == "en") { + continue; } + + QLocale locale(langcode); + QString languageStr = QLocale::languageToString(locale.language()); + if (langcode == "la") { + // langcode "la" (Latin) is translated into "C" by QLocale::languageToString() + languageStr = "Latin"; + } + if (langcode.contains("_")) { + languageStr += QString(" (%1)").arg(QLocale::countryToString(locale.country())); + } + + QPair language(langcode, languageStr); + languages.append(language); } } diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index ec65dbba1..5cfe323b6 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -770,6 +770,9 @@ void TestGui::testDicewareEntryEntropy() auto* spinBoxWordCount = dicewareWidget->findChild("spinBoxWordCount"); spinBoxWordCount->setValue(6); + // Confirm a password was generated + QVERIFY(!pwGeneratorWidget->getGeneratedPassword().isEmpty()); + // Verify entropy and strength auto* entropyLabel = pwGeneratorWidget->findChild("entropyLabel"); auto* strengthLabel = pwGeneratorWidget->findChild("strengthLabel");