diff --git a/src/cmd/cmd.cpp b/src/cmd/cmd.cpp index 191dcc547b..da092807b1 100644 --- a/src/cmd/cmd.cpp +++ b/src/cmd/cmd.cpp @@ -295,9 +295,10 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList) bool ok = false; - auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet(); + const auto selectiveSyncList = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok); + const QSet oldBlackListSet(selectiveSyncList.begin(), selectiveSyncList.end()); if (ok) { - auto blackListSet = newList.toSet(); + const QSet blackListSet(newList.begin(), newList.end()); const auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet); for (const auto &it : changes) { journal->schedulePathForRemoteDiscovery(it); @@ -317,8 +318,6 @@ int main(int argc, char **argv) qputenv("OPENSSL_CONF", opensslConf.toLocal8Bit()); #endif - qsrand(std::random_device()()); - CmdOptions options; options.silent = false; options.trustSSL = false; diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp index 11dc84458b..5c5195bba4 100644 --- a/src/common/syncjournaldb.cpp +++ b/src/common/syncjournaldb.cpp @@ -93,7 +93,6 @@ static QByteArray defaultJournalMode(const QString &dbPath) SyncJournalDb::SyncJournalDb(const QString &dbFilePath, QObject *parent) : QObject(parent) , _dbFile(dbFilePath) - , _mutex(QMutex::Recursive) , _transaction(0) , _metadataTableIsEmpty(false) { diff --git a/src/common/syncjournaldb.h b/src/common/syncjournaldb.h index 8436d47751..ba4c0ede8e 100644 --- a/src/common/syncjournaldb.h +++ b/src/common/syncjournaldb.h @@ -393,7 +393,7 @@ private: SqlDatabase _db; QString _dbFile; - QMutex _mutex; // Public functions are protected with the mutex. + QRecursiveMutex _mutex; // Public functions are protected with the mutex. QMap _checksymTypeCache; int _transaction; bool _metadataTableIsEmpty; diff --git a/src/common/utility.cpp b/src/common/utility.cpp index e31534ca38..bd9394b8c3 100644 --- a/src/common/utility.cpp +++ b/src/common/utility.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #ifdef Q_OS_UNIX @@ -64,14 +65,13 @@ Q_LOGGING_CATEGORY(lcUtility, "nextcloud.sync.utility", QtInfoMsg) bool Utility::writeRandomFile(const QString &fname, int size) { int maxSize = 10 * 10 * 1024; - qsrand(QDateTime::currentMSecsSinceEpoch()); if (size == -1) - size = qrand() % maxSize; + size = rand() % maxSize; QString randString; for (int i = 0; i < size; i++) { - int r = qrand() % 128; + int r = rand() % 128; randString.append(QChar(r)); } @@ -259,6 +259,11 @@ QString Utility::escape(const QString &in) return in.toHtmlEscaped(); } +int Utility::rand() +{ + return QRandomGenerator::global()->bounded(0, RAND_MAX); +} + void Utility::sleep(int sec) { QThread::sleep(sec); diff --git a/src/common/utility.h b/src/common/utility.h index 0d0bc3ade3..9522d188e7 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -50,6 +50,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcUtility) * @{ */ namespace Utility { + OCSYNC_EXPORT int rand(); OCSYNC_EXPORT void sleep(int sec); OCSYNC_EXPORT void usleep(int usec); OCSYNC_EXPORT QString formatFingerprint(const QByteArray &, bool colonSeparated = true); diff --git a/src/common/utility_unix.cpp b/src/common/utility_unix.cpp index 010408395f..087254e600 100644 --- a/src/common/utility_unix.cpp +++ b/src/common/utility_unix.cpp @@ -80,17 +80,17 @@ void setLaunchOnStartup_private(const QString &appName, const QString &guiName, QTextStream ts(&iniFile); ts.setCodec("UTF-8"); - ts << QLatin1String("[Desktop Entry]") << endl - << QLatin1String("Name=") << guiName << endl - << QLatin1String("GenericName=") << QLatin1String("File Synchronizer") << endl - << QLatin1String("Exec=\"") << executablePath << "\" --background" << endl - << QLatin1String("Terminal=") << "false" << endl - << QLatin1String("Icon=") << APPLICATION_ICON_NAME << endl - << QLatin1String("Categories=") << QLatin1String("Network") << endl - << QLatin1String("Type=") << QLatin1String("Application") << endl - << QLatin1String("StartupNotify=") << "false" << endl - << QLatin1String("X-GNOME-Autostart-enabled=") << "true" << endl - << QLatin1String("X-GNOME-Autostart-Delay=10") << endl; + ts << QLatin1String("[Desktop Entry]\n") + << QLatin1String("Name=") << guiName << QLatin1Char('\n') + << QLatin1String("GenericName=") << QLatin1String("File Synchronizer\n") + << QLatin1String("Exec=\"") << executablePath << "\" --background\n" + << QLatin1String("Terminal=") << "false\n" + << QLatin1String("Icon=") << APPLICATION_ICON_NAME << QLatin1Char('\n') + << QLatin1String("Categories=") << QLatin1String("Network\n") + << QLatin1String("Type=") << QLatin1String("Application\n") + << QLatin1String("StartupNotify=") << "false\n" + << QLatin1String("X-GNOME-Autostart-enabled=") << "true\n" + << QLatin1String("X-GNOME-Autostart-Delay=10") << Qt::endl; } else { if (!QFile::remove(desktopFileLocation)) { qCWarning(lcUtility) << "Could not remove autostart desktop file"; diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp index 3ffc048497..51bbe4f748 100644 --- a/src/gui/folderstatusmodel.cpp +++ b/src/gui/folderstatusmodel.cpp @@ -907,7 +907,7 @@ void FolderStatusModel::slotApplySelectiveSync() // The folders that were undecided or blacklisted and that are now checked should go on the white list. // The user confirmed them already just now. - QStringList toAddToWhiteList = ((oldBlackListSet + folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok).toSet()) - blackListSet).toList(); + QStringList toAddToWhiteList = ((oldBlackListSet + folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok).toSet()) - blackListSet).values(); if (!toAddToWhiteList.isEmpty()) { auto whiteList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, &ok); diff --git a/src/gui/openfilemanager.cpp b/src/gui/openfilemanager.cpp index 3754bbd9fe..4a4161434f 100644 --- a/src/gui/openfilemanager.cpp +++ b/src/gui/openfilemanager.cpp @@ -103,7 +103,7 @@ void showInFileManager(const QString &localPath) return; #endif - QString explorer = "explorer.exe "; // FIXME: we trust it's in PATH + const QString explorer = "explorer.exe "; // FIXME: we trust it's in PATH QFileInfo fi(localPath); // canonicalFilePath returns empty if the file does not exist @@ -123,7 +123,7 @@ void showInFileManager(const QString &localPath) // only around the path. Use setNativeArguments to bypass this logic. p.setNativeArguments(nativeArgs); #endif - p.start(explorer); + p.start(explorer, QStringList {}); p.waitForFinished(5000); } } else if (Utility::isMac()) { diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 02bcbb39a8..8beb34412f 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include "creds/abstractcredentials.h" @@ -371,7 +372,7 @@ QSslConfiguration Account::getOrCreateSslConfig() void Account::setApprovedCerts(const QList certs) { _approvedCerts = certs; - QSslSocket::addDefaultCaCertificates(certs); + QSslConfiguration::defaultConfiguration().addCaCertificates(certs); } void Account::addApprovedCerts(const QList certs) @@ -463,7 +464,7 @@ void Account::slotHandleSslErrors(QNetworkReply *reply, QList errors) return; if (!approvedCerts.isEmpty()) { - QSslSocket::addDefaultCaCertificates(approvedCerts); + QSslConfiguration::defaultConfiguration().addCaCertificates(approvedCerts); addApprovedCerts(approvedCerts); emit wantsAccountSaved(this); diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index fddd5ed88e..0f2059be26 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -645,7 +645,7 @@ int ConfigFile::updateSegment() const // Invalid? (Unset at the very first launch) if(segment < 0 || segment > 99) { // Save valid segment value, normally has to be done only once. - segment = qrand() % 99; + segment = Utility::rand() % 99; settings.setValue(QLatin1String(updateSegmentC), segment); } diff --git a/src/libsync/logger.cpp b/src/libsync/logger.cpp index b43dc28cd8..8aa0360c2f 100644 --- a/src/libsync/logger.cpp +++ b/src/libsync/logger.cpp @@ -92,7 +92,7 @@ void Logger::doLog(QtMsgType type, const QMessageLogContext &ctx, const QString _crashLogIndex = (_crashLogIndex + 1) % CrashLogSize; _crashLog[_crashLogIndex] = msg; if (_logstream) { - (*_logstream) << msg << endl; + (*_logstream) << msg << Qt::endl; if (_doFileFlush) _logstream->flush(); } diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index d55f4f1eeb..cdda9abeb0 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -63,9 +63,9 @@ QString OWNCLOUDSYNC_EXPORT createDownloadTmpFileName(const QString &previous) int overhead = 1 + 1 + 2 + 8; // slash dot dot-tilde ffffffff" int spaceForFileName = qMin(254, tmpFileName.length() + overhead) - overhead; if (tmpPath.length() > 0) { - return tmpPath + '/' + '.' + tmpFileName.left(spaceForFileName) + ".~" + (QString::number(uint(qrand() % 0xFFFFFFFF), 16)); + return tmpPath + '/' + '.' + tmpFileName.left(spaceForFileName) + ".~" + (QString::number(uint(Utility::rand() % 0xFFFFFFFF), 16)); } else { - return '.' + tmpFileName.left(spaceForFileName) + ".~" + (QString::number(uint(qrand() % 0xFFFFFFFF), 16)); + return '.' + tmpFileName.left(spaceForFileName) + ".~" + (QString::number(uint(Utility::rand() % 0xFFFFFFFF), 16)); } } diff --git a/src/libsync/propagateuploadng.cpp b/src/libsync/propagateuploadng.cpp index b99fc06cce..0b4b40a861 100644 --- a/src/libsync/propagateuploadng.cpp +++ b/src/libsync/propagateuploadng.cpp @@ -229,7 +229,7 @@ void PropagateUploadFileNG::slotDeleteJobFinished() void PropagateUploadFileNG::startNewUpload() { ASSERT(propagator()->_activeJobList.count(this) == 1); - _transferId = uint(qrand() ^ uint(_item->_modtime) ^ (uint(_fileToUpload._size) << 16) ^ qHash(_fileToUpload._file)); + _transferId = uint(Utility::rand() ^ uint(_item->_modtime) ^ (uint(_fileToUpload._size) << 16) ^ qHash(_fileToUpload._file)); _sent = 0; _currentChunk = 0; diff --git a/src/libsync/propagateuploadv1.cpp b/src/libsync/propagateuploadv1.cpp index 8e4ec1e05e..40662fa207 100644 --- a/src/libsync/propagateuploadv1.cpp +++ b/src/libsync/propagateuploadv1.cpp @@ -39,7 +39,7 @@ void PropagateUploadFileV1::doStartUpload() { _chunkCount = int(std::ceil(_fileToUpload._size / double(chunkSize()))); _startChunk = 0; - _transferId = uint(qrand()) ^ uint(_item->_modtime) ^ (uint(_fileToUpload._size) << 16); + _transferId = uint(Utility::rand()) ^ uint(_item->_modtime) ^ (uint(_fileToUpload._size) << 16); const SyncJournalDb::UploadInfo progressInfo = propagator()->_journal->getUploadInfo(_item->_file); diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index d531fcc7d4..38f49785af 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -690,8 +690,12 @@ void SyncEngine::slotDiscoveryFinished() const QString script = qEnvironmentVariable("OWNCLOUD_POST_UPDATE_SCRIPT"); qCDebug(lcEngine) << "Post Update Script: " << script; - QProcess::execute(script); - #else + auto scriptArgs = script.split(QRegExp("\\s+"), Qt::SkipEmptyParts); + if (scriptArgs.size() > 0) { + const auto scriptExecutable = scriptArgs.takeFirst(); + QProcess::execute(scriptExecutable, scriptArgs); + } +#else qCWarning(lcEngine) << "**** Attention: POST_UPDATE_SCRIPT installed, but not executed because compiled with NDEBUG"; #endif } diff --git a/src/libsync/syncfilestatustracker.cpp b/src/libsync/syncfilestatustracker.cpp index 276bc4f8d0..9c4ae0e8ca 100644 --- a/src/libsync/syncfilestatustracker.cpp +++ b/src/libsync/syncfilestatustracker.cpp @@ -339,7 +339,7 @@ SyncFileStatus SyncFileStatusTracker::resolveSyncAndErrorStatus(const QString &r void SyncFileStatusTracker::invalidateParentPaths(const QString &path) { - QStringList splitPath = path.split('/', QString::SkipEmptyParts); + QStringList splitPath = path.split('/', Qt::SkipEmptyParts); for (int i = 0; i < splitPath.size(); ++i) { QString parentPath = QStringList(splitPath.mid(0, i)).join(QLatin1String("/")); emit fileStatusChanged(getSystemDestination(parentPath), fileStatus(parentPath)); diff --git a/src/libsync/theme.cpp b/src/libsync/theme.cpp index d66fa8d813..c4e6e83b74 100644 --- a/src/libsync/theme.cpp +++ b/src/libsync/theme.cpp @@ -705,17 +705,17 @@ QString Theme::versionSwitchOutput() const QTextStream stream(&helpText); stream << appName() << QLatin1String(" version ") - << version() << endl; + << version() << Qt::endl; #ifdef GIT_SHA1 - stream << "Git revision " << GIT_SHA1 << endl; + stream << "Git revision " << GIT_SHA1 << Qt::endl; #endif - stream << "Using Qt " << qVersion() << ", built against Qt " << QT_VERSION_STR << endl; + stream << "Using Qt " << qVersion() << ", built against Qt " << QT_VERSION_STR << Qt::endl; if(!QGuiApplication::platformName().isEmpty()) - stream << "Using Qt platform plugin '" << QGuiApplication::platformName() << "'" << endl; + stream << "Using Qt platform plugin '" << QGuiApplication::platformName() << "'" << Qt::endl; - stream << "Using '" << QSslSocket::sslLibraryVersionString() << "'" << endl; - stream << "Running on " << Utility::platformName() << ", " << QSysInfo::currentCpuArchitecture() << endl; + stream << "Using '" << QSslSocket::sslLibraryVersionString() << "'" << Qt::endl; + stream << "Running on " << Utility::platformName() << ", " << QSysInfo::currentCpuArchitecture() << Qt::endl; return helpText; } diff --git a/test/syncenginetestutils.cpp b/test/syncenginetestutils.cpp index 001791af27..7b5caa94a1 100644 --- a/test/syncenginetestutils.cpp +++ b/test/syncenginetestutils.cpp @@ -20,7 +20,7 @@ PathComponents::PathComponents(const char *path) } PathComponents::PathComponents(const QString &path) - : QStringList { path.split(QLatin1Char('/'), QString::SkipEmptyParts) } + : QStringList { path.split(QLatin1Char('/'), Qt::SkipEmptyParts) } { } @@ -796,7 +796,7 @@ void FakeHangingReply::abort() // Follow more or less the implementation of QNetworkReplyImpl::abort close(); setError(OperationCanceledError, tr("Operation canceled")); - emit error(OperationCanceledError); + emit errorOccurred(OperationCanceledError); setFinished(true); emit finished(); } diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h index 7596bbd904..6b170866aa 100644 --- a/test/syncenginetestutils.h +++ b/test/syncenginetestutils.h @@ -52,10 +52,10 @@ inline QString getFilePathFromUrl(const QUrl &url) inline QByteArray generateEtag() { - return QByteArray::number(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(), 16) + QByteArray::number(qrand(), 16); + return QByteArray::number(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(), 16) + QByteArray::number(OCC::Utility::rand(), 16); } inline QByteArray generateFileId() { - return QByteArray::number(qrand(), 16); + return QByteArray::number(OCC::Utility::rand(), 16); } class PathComponents : public QStringList { diff --git a/test/testcookies.cpp b/test/testcookies.cpp index a5053abd9c..eead479533 100644 --- a/test/testcookies.cpp +++ b/test/testcookies.cpp @@ -21,7 +21,7 @@ private slots: const QString nonexistingPath = tmp.filePath("someNonexistingDir/test.db"); QNetworkCookie cookieA = QNetworkCookie("foo", "bar"); // tomorrow rounded - cookieA.setExpirationDate(QDateTime(QDateTime::currentDateTimeUtc().addDays(1).date())); + cookieA.setExpirationDate(QDateTime::currentDateTimeUtc().addDays(1).date().startOfDay()); const QList cookies = {cookieA, QNetworkCookie("foo2", "bar")}; CookieJar jar; jar.setAllCookies(cookies); diff --git a/test/testfolderwatcher.cpp b/test/testfolderwatcher.cpp index 7345e64502..d8c7da0924 100644 --- a/test/testfolderwatcher.cpp +++ b/test/testfolderwatcher.cpp @@ -103,8 +103,8 @@ class TestFolderWatcher : public QObject #endif public: - TestFolderWatcher() { - qsrand(QTime::currentTime().msec()); + TestFolderWatcher() + { QDir rootDir(_root.path()); _rootPath = rootDir.canonicalPath(); qDebug() << "creating test directory tree in " << _rootPath; diff --git a/test/testinotifywatcher.cpp b/test/testinotifywatcher.cpp index 2d8cf937d1..204939f913 100644 --- a/test/testinotifywatcher.cpp +++ b/test/testinotifywatcher.cpp @@ -19,10 +19,9 @@ private: QString _root; private slots: - void initTestCase() { - qsrand(QTime::currentTime().msec()); - - _root = QDir::tempPath() + "/" + "test_" + QString::number(qrand()); + void initTestCase() + { + _root = QDir::tempPath() + "/" + "test_" + QString::number(OCC::Utility::rand()); qDebug() << "creating test directory tree in " << _root; QDir rootDir(_root); @@ -31,7 +30,6 @@ private slots: rootDir.mkpath(_root + "/a1/b2/c1"); rootDir.mkpath(_root + "/a1/b3/c3"); rootDir.mkpath(_root + "/a2/b3/c3"); - } // Test the recursive path listing function findFoldersBelow diff --git a/test/testutility.cpp b/test/testutility.cpp index cd0d1045c9..f65bf985ec 100644 --- a/test/testutility.cpp +++ b/test/testutility.cpp @@ -58,8 +58,7 @@ private slots: void testLaunchOnStartup() { - qsrand(QDateTime::currentDateTime().toTime_t()); - QString postfix = QString::number(qrand()); + QString postfix = QString::number(OCC::Utility::rand()); const QString appName = QString::fromLatin1("testLaunchOnStartup.%1").arg(postfix); const QString guiName = "LaunchOnStartup GUI Name";