Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/common/syncjournaldb.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
/*
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014 ownCloud GmbH
* SPDX-License-Identifier: LGPL-2.1-or-later
*/

#include <QCryptographicHash>

Check failure on line 7 in src/common/syncjournaldb.cpp

View workflow job for this annotation

GitHub Actions / build

src/common/syncjournaldb.cpp:7:10 [clang-diagnostic-error]

'QCryptographicHash' file not found
#include <QFile>
#include <QLoggingCategory>
#include <QStringList>
Expand Down Expand Up @@ -1762,6 +1762,40 @@
return true;
}

bool SyncJournalDb::hasFileIds(const QList<qint64> &fileIds)
{
QMutexLocker locker(&_mutex);

if (!checkConnect()) {
return false;
}

QStringList fileIdStrings = {};
for (const auto &fileId : fileIds) {
fileIdStrings.append(QString::number(fileId));
}

// quick workaround for looking up pure numeric file IDs: simply `round()` that field!
// this will return the file ID as e.g. 12345.0, but that's still good enough to use it
// with the IN operator -- e.g. (12345, 1337, 29001)
SqlQuery query(
QLatin1String{"SELECT 1 FROM metadata WHERE ROUND(fileid) IN (%1) LIMIT 1;"}
.arg(fileIdStrings.join(QLatin1String{", "})).toLocal8Bit(),
_db
);
Comment on lines +1781 to +1785
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please use a prepared SQL request with SQL placeholders ?
for example https://github.com/nextcloud/desktop/blob/master/src/common/syncjournaldb.cpp#L1111-L1121

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how useful the prepared SQL query would be in this case as there is simply no way to bind an array to a single placeholder, and the passed fileIds array does not have a consistent size. I would also rather avoid to have query each possible fileid one after the other until at least one entry was found...


if (!query.exec()) {
qCWarning(lcDb) << "file id query failed:" << query.error();
return false;
}

if (query.next().hasData && query.intValue(0) == 1) {
return true;
}

return false;
}

Optional<SyncJournalDb::HasHydratedDehydrated> SyncJournalDb::hasHydratedOrDehydratedFiles(const QByteArray &filename)
{
QMutexLocker locker(&_mutex);
Expand Down
2 changes: 2 additions & 0 deletions src/common/syncjournaldb.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#ifndef SYNCJOURNALDB_H
#define SYNCJOURNALDB_H

#include <QObject>

Check failure on line 10 in src/common/syncjournaldb.h

View workflow job for this annotation

GitHub Actions / build

src/common/syncjournaldb.h:10:10 [clang-diagnostic-error]

'QObject' file not found
#include <QDateTime>
#include <QHash>
#include <QMutex>
Expand Down Expand Up @@ -76,6 +76,8 @@
[[nodiscard]] bool updateLocalMetadata(const QString &filename,
qint64 modtime, qint64 size, quint64 inode, const SyncJournalFileLockInfo &lockInfo);

[[nodiscard]] bool hasFileIds(const QList<qint64> &fileIds);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should not be const ?


/// Return value for hasHydratedOrDehydratedFiles()
struct HasHydratedDehydrated
{
Expand Down
11 changes: 11 additions & 0 deletions src/gui/folder.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
/*
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014 ownCloud GmbH
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#include "common/syncjournaldb.h"

Check failure on line 7 in src/gui/folder.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.cpp:7:10 [clang-diagnostic-error]

'common/syncjournaldb.h' file not found
#include "config.h"

#include "account.h"
Expand Down Expand Up @@ -92,6 +92,7 @@

connect(_accountState.data(), &AccountState::isConnectedChanged, this, &Folder::canSyncChanged);
connect(_engine.data(), &SyncEngine::rootEtag, this, &Folder::etagRetrievedFromSyncEngine);
connect(_engine.data(), &SyncEngine::rootFileIdReceived, this, &Folder::rootFileIdReceivedFromSyncEngine);

connect(_engine.data(), &SyncEngine::started, this, &Folder::slotSyncStarted, Qt::QueuedConnection);
connect(_engine.data(), &SyncEngine::finished, this, &Folder::slotSyncFinished, Qt::QueuedConnection);
Expand Down Expand Up @@ -397,6 +398,11 @@
_lastEtag = etag;
}

void Folder::rootFileIdReceivedFromSyncEngine(const qint64 fileId)
{
qCDebug(lcFolder).nospace() << "retrieved root fileId=" << fileId;
_rootFileId = fileId;
}

void Folder::showSyncResultPopup()
{
Expand Down Expand Up @@ -1003,7 +1009,12 @@
}
}

bool Folder::hasFileIds(const QList<qint64>& fileIds) const

Check warning on line 1012 in src/gui/folder.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.cpp:1012:14 [modernize-use-trailing-return-type]

use a trailing return type for this function
{
return fileIds.contains(_rootFileId) || journalDb()->hasFileIds(fileIds);
}

QString Folder::filePath(const QString& fileName)

Check warning on line 1017 in src/gui/folder.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.cpp:1017:17 [modernize-use-trailing-return-type]

use a trailing return type for this function
{
const auto folderDir = QDir(_canonicalLocalPath);

Expand Down
8 changes: 8 additions & 0 deletions src/gui/folder.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014 ownCloud GmbH
Expand All @@ -7,7 +7,7 @@
#ifndef MIRALL_FOLDER_H
#define MIRALL_FOLDER_H

#include "syncresult.h"

Check failure on line 10 in src/gui/folder.h

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.h:10:10 [clang-diagnostic-error]

'syncresult.h' file not found
#include "progressdispatcher.h"
#include "common/syncjournaldb.h"
#include "networkjobs.h"
Expand Down Expand Up @@ -316,6 +316,9 @@
void blacklistPath(const QString &path);
void migrateBlackListPath(const QString &legacyPath);

/// whether the current folder contains any of the passed fileIds
[[nodiscard]] bool hasFileIds(const QList<qint64>& fileIds) const;

signals:
void syncStateChange();
void syncStarted();
Expand Down Expand Up @@ -429,6 +432,8 @@
void etagRetrieved(const QByteArray &, const QDateTime &tp);
void etagRetrievedFromSyncEngine(const QByteArray &, const QDateTime &time);

void rootFileIdReceivedFromSyncEngine(const qint64 fileId);

void slotEmitFinishedDelayed();

void slotNewBigFolderDiscovered(const QString &, bool isExternal);
Expand Down Expand Up @@ -585,6 +590,9 @@
QMetaObject::Connection _officeFileLockReleaseUnlockFailure;
QMetaObject::Connection _fileLockSuccess;
QMetaObject::Connection _fileLockFailure;

/// The remote file ID of the current folder.
qint64 _rootFileId = 0;
};
}

Expand Down
25 changes: 23 additions & 2 deletions src/gui/folderman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2079,15 +2079,35 @@ void FolderMan::slotSetupPushNotifications(const Folder::Map &folderMap)

void FolderMan::slotProcessFilesPushNotification(Account *account)
{
qCInfo(lcFolderMan) << "Got files push notification for account" << account;
qCDebug(lcFolderMan) << "received notify_file push notification account=" << account->displayName();

for (auto folder : std::as_const(_folderMap)) {
// Just run on the folders that belong to this account
if (folder->accountState()->account() != account) {
continue;
}

qCInfo(lcFolderMan) << "Schedule folder" << folder << "for sync";
qCInfo(lcFolderMan).nospace() << "scheduling sync account=" << account->displayName() << " folder=" << folder->alias() << " reason=notify_file";
scheduleFolder(folder);
}
}

void FolderMan::slotProcessFileIdsPushNotification(Account *account, const QList<qint64> &fileIds)
{
qCDebug(lcFolderMan).nospace() << "received notify_file_id push notification account=" << account->displayName() << " fileIds=" << fileIds;

for (auto folder : std::as_const(_folderMap)) {
// Just run on the folders that belong to this account
if (folder->accountState()->account() != account) {
continue;
}

if (!folder->hasFileIds(fileIds)) {
qCDebug(lcFolderMan).nospace() << "no matching file ids, ignoring account=" << account->displayName() << " folder=" << folder->alias();
continue;
}

qCInfo(lcFolderMan).nospace() << "scheduling sync account=" << account->displayName() << " folder=" << folder->alias() << " reason=notify_file_id";
scheduleFolder(folder);
}
}
Expand All @@ -2099,6 +2119,7 @@ void FolderMan::slotConnectToPushNotifications(const AccountPtr &account)
if (pushNotificationsFilesReady(account)) {
qCInfo(lcFolderMan) << "Push notifications ready";
connect(pushNotifications, &PushNotifications::filesChanged, this, &FolderMan::slotProcessFilesPushNotification, Qt::UniqueConnection);
connect(pushNotifications, &PushNotifications::fileIdsChanged, this, &FolderMan::slotProcessFileIdsPushNotification, Qt::UniqueConnection);
}
}

Expand Down
1 change: 1 addition & 0 deletions src/gui/folderman.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#ifndef FOLDERMAN_H
#define FOLDERMAN_H

#include <QByteArray>

Check failure on line 10 in src/gui/folderman.h

View workflow job for this annotation

GitHub Actions / build

src/gui/folderman.h:10:10 [clang-diagnostic-error]

'QByteArray' file not found
#include <QObject>
#include <QQueue>
#include <QList>
Expand Down Expand Up @@ -329,6 +329,7 @@

void slotSetupPushNotifications(const OCC::Folder::Map &);
void slotProcessFilesPushNotification(OCC::Account *account);
void slotProcessFileIdsPushNotification(OCC::Account *account, const QList<qint64> &fileIds);
void slotConnectToPushNotifications(const OCC::AccountPtr &account);

void slotLeaveShare(const QString &localFile, const QByteArray &folderToken = {});
Expand Down
1 change: 1 addition & 0 deletions src/libsync/discovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2235,6 +2235,7 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
}

connect(serverJob, &DiscoverySingleDirectoryJob::etag, this, &ProcessDirectoryJob::etag);
connect(serverJob, &DiscoverySingleDirectoryJob::rootFileIdReceived, this, &ProcessDirectoryJob::rootFileIdReceived);
connect(serverJob, &DiscoverySingleDirectoryJob::setfolderQuota, this, &ProcessDirectoryJob::setFolderQuota);
_discoveryData->_currentlyActiveJobs++;
_pendingAsyncJobs++;
Expand Down
1 change: 1 addition & 0 deletions src/libsync/discovery.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#pragma once

#include <QObject>

Check failure on line 9 in src/libsync/discovery.h

View workflow job for this annotation

GitHub Actions / build

src/libsync/discovery.h:9:10 [clang-diagnostic-error]

'QObject' file not found
#include <cstdint>
#include "csync_exclude.h"
#include "discoveryphase.h"
Expand Down Expand Up @@ -306,6 +306,7 @@
// The root etag of this directory was fetched
void etag(const QByteArray &, const QDateTime &time);
void updatedRootFolderQuota(const int64_t &bytesUsed, const int64_t &bytesAvailable);
void rootFileIdReceived(const qint64 fileId);

private slots:
void setFolderQuota(const FolderQuota &folderQuota);
Expand Down
9 changes: 9 additions & 0 deletions src/libsync/discoveryphase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,7 @@
}
}

void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(const QString &file, const QMap<QString, QString> &map)

Check warning on line 593 in src/libsync/discoveryphase.cpp

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.cpp:593:35 [readability-function-cognitive-complexity]

function 'directoryListingIteratedSlot' has cognitive complexity of 33 (threshold 25)
{
if (!_ignoredFirst) {
// The first entry is for the folder itself, we should process it differently.
Expand All @@ -613,8 +613,17 @@
_localFileId = map.value(QStringLiteral("fileid")).toUtf8();
}
if (map.contains("id")) {
// this is from the "oc:id" property, the format is e.g. "00000002oc123xyz987e"
_fileId = map.value("id").toUtf8();
}
if (map.contains("fileid")) {
// this is from the "oc:fileid" property, this is the plain ID without any special format (e.g. "2")
bool ok = false;

Check warning on line 621 in src/libsync/discoveryphase.cpp

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.cpp:621:18 [readability-identifier-length]

variable name 'ok' is too short, expected at least 3 characters
if (qint64 numericFileId = map.value("fileid").toLongLong(&ok); ok) {

Check warning on line 622 in src/libsync/discoveryphase.cpp

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.cpp:622:24 [cppcoreguidelines-init-variables]

variable 'numericFileId' is not initialized
qCDebug(lcDiscovery).nospace() << "received numericFileId=" << numericFileId;
emit rootFileIdReceived(numericFileId);

Check warning on line 624 in src/libsync/discoveryphase.cpp

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.cpp:624:22 [cppcoreguidelines-init-variables]

variable 'rootFileIdReceived' is not initialized
}
}
if (map.contains("is-encrypted") && map.value("is-encrypted") == QStringLiteral("1")) {
_encryptionStatusCurrent = SyncFileItem::EncryptionStatus::EncryptedMigratedV2_0;
Q_ASSERT(!_fileId.isEmpty());
Expand Down
1 change: 1 addition & 0 deletions src/libsync/discoveryphase.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#pragma once

#include <QObject>

Check failure on line 9 in src/libsync/discoveryphase.h

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.h:9:10 [clang-diagnostic-error]

'QObject' file not found
#include <QElapsedTimer>
#include <QStringList>
#include <csync.h>
Expand Down Expand Up @@ -186,6 +186,7 @@
void etag(const QByteArray &, const QDateTime &time);
void finished(const OCC::HttpResult<QVector<OCC::RemoteInfo>> &result);
void setfolderQuota(const FolderQuota &folderQuota);
void rootFileIdReceived(const qint64 fileId);

private slots:
void directoryListingIteratedSlot(const QString &, const QMap<QString, QString> &);
Expand Down
45 changes: 41 additions & 4 deletions src/libsync/pushnotifications.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
Expand All @@ -7,9 +7,13 @@
#include "creds/abstractcredentials.h"
#include "account.h"

#include <QJsonArray>

namespace {
static constexpr int MAX_ALLOWED_FAILED_AUTHENTICATION_ATTEMPTS = 3;
static constexpr int PING_INTERVAL = 30 * 1000;

static constexpr QLatin1String NOTIFY_FILE_ID_PREFIX = QLatin1String{"notify_file_id "};
}

namespace OCC {
Expand Down Expand Up @@ -102,7 +106,9 @@
{
qCInfo(lcPushNotifications) << "Received push notification:" << message;

if (message == "notify_file") {
if (message.startsWith(NOTIFY_FILE_ID_PREFIX)) {
handleNotifyFileId(message);
} else if (message == "notify_file") {
handleNotifyFile();
} else if (message == "notify_activity") {
handleNotifyActivity();
Expand All @@ -124,7 +130,7 @@
return;
}

qCWarning(lcPushNotifications) << "Websocket error on with account" << _account->url() << error;
qCWarning(lcPushNotifications) << "Websocket error on with account" << _account->displayName() << _account->url() << error;
closeWebSocket();
emit connectionLost();
}
Expand Down Expand Up @@ -153,7 +159,7 @@

void PushNotifications::onWebSocketSslErrors(const QList<QSslError> &errors)
{
qCWarning(lcPushNotifications) << "Websocket ssl errors on with account" << _account->url() << errors;
qCWarning(lcPushNotifications) << "Websocket ssl errors on with account" << _account->displayName() << _account->url() << errors;
closeWebSocket();
emit authenticationFailed();
}
Expand All @@ -164,7 +170,7 @@
const auto capabilities = _account->capabilities();
const auto webSocketUrl = capabilities.pushNotificationsWebSocketUrl();

qCInfo(lcPushNotifications) << "Open connection to websocket on" << webSocketUrl << "for account" << _account->url();
qCInfo(lcPushNotifications) << "Open connection to websocket on" << webSocketUrl << "for account" << _account->displayName() << _account->url();
connect(_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::errorOccurred), this, &PushNotifications::onWebSocketError);
connect(_webSocket, &QWebSocket::sslErrors, this, &PushNotifications::onWebSocketSslErrors);
_webSocket->open(webSocketUrl);
Expand All @@ -184,6 +190,8 @@
{
qCInfo(lcPushNotifications) << "Authenticated successful on websocket";
_failedAuthenticationAttemptsCount = 0;
qCDebug(lcPushNotifications) << "Requesting opt-in to 'notify_file_id' notifications";
_webSocket->sendTextMessage("listen notify_file_id");
_isReady = true;
startPingTimer();
emit ready();
Expand All @@ -202,6 +210,35 @@
emitFilesChanged();
}

void PushNotifications::handleNotifyFileId(const QString &message)
{
qCDebug(lcPushNotifications) << "File-ID push notification arrived";

QList<qint64> fileIds{};
QJsonParseError parseError;
const auto fileIdsJson = message.mid(NOTIFY_FILE_ID_PREFIX.length());
const auto jsonDoc = QJsonDocument::fromJson(fileIdsJson.toUtf8(), &parseError);

if (parseError.error != QJsonParseError::NoError) {
qCWarning(lcPushNotifications).nospace() << "could not parse received list of file IDs error=" << parseError.error << " errorString=" << parseError.errorString() << " fileIdsJson=" << fileIdsJson;
return;
}

if (const auto jsonArray = jsonDoc.array(); jsonDoc.isArray()) {
for (const auto& fileid : jsonArray) {
if (const auto fid = fileid.toInteger(); fileid.isDouble()) {
fileIds.push_back(fid);
}
}
}

if (fileIds.empty()) {
return;
}

emit fileIdsChanged(_account, fileIds);
}

void PushNotifications::handleInvalidCredentials()
{
qCInfo(lcPushNotifications) << "Invalid credentials submitted to websocket";
Expand Down
6 changes: 6 additions & 0 deletions src/libsync/pushnotifications.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#pragma once

#include <QWebSocket>

Check failure on line 8 in src/libsync/pushnotifications.h

View workflow job for this annotation

GitHub Actions / build

src/libsync/pushnotifications.h:8:10 [clang-diagnostic-error]

'QWebSocket' file not found
#include <QTimer>

#include "capabilities.h"
Expand Down Expand Up @@ -65,6 +65,11 @@
*/
void filesChanged(OCC::Account *account);

/**
* Will be emitted if specific files on the server changed
*/
void fileIdsChanged(OCC::Account *account, const QList<qint64> &fileIds);

/**
* Will be emitted if activities have been changed on the server
*/
Expand Down Expand Up @@ -111,6 +116,7 @@

void handleAuthenticated();
void handleNotifyFile();
void handleNotifyFileId(const QString &message);
void handleInvalidCredentials();
void handleNotifyNotification();
void handleNotifyActivity();
Expand Down
11 changes: 11 additions & 0 deletions src/libsync/syncengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,7 @@ void SyncEngine::startSync()
_discoveryPhase->startJob(discoveryJob);
connect(discoveryJob, &ProcessDirectoryJob::etag, this, &SyncEngine::slotRootEtagReceived);
connect(discoveryJob, &ProcessDirectoryJob::updatedRootFolderQuota, account().data(), &Account::rootFolderQuotaChanged);
connect(discoveryJob, &ProcessDirectoryJob::rootFileIdReceived, this, &SyncEngine::slotRootFileIdReceived);
connect(_discoveryPhase.get(), &DiscoveryPhase::addErrorToGui, this, &SyncEngine::addErrorToGui);
}

Expand Down Expand Up @@ -792,6 +793,16 @@ void SyncEngine::slotRootEtagReceived(const QByteArray &e, const QDateTime &time
}
}

void SyncEngine::slotRootFileIdReceived(const qint64 fileId)
{
if (_rootFileIdReceived) {
return;
}
_rootFileId = fileId;
_rootFileIdReceived = true;
emit rootFileIdReceived(fileId);
}

void SyncEngine::slotNewItem(const SyncFileItemPtr &item)
{
_progressInfo->adjustTotalsForFile(*item);
Expand Down
4 changes: 4 additions & 0 deletions src/libsync/syncengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#pragma once

#include <cstdint>

Check failure on line 9 in src/libsync/syncengine.h

View workflow job for this annotation

GitHub Actions / build

src/libsync/syncengine.h:9:10 [clang-diagnostic-error]

'cstdint' file not found

#include <QMutex>
#include <QThread>
Expand Down Expand Up @@ -155,6 +155,7 @@
signals:
// During update, before reconcile
void rootEtag(const QByteArray &, const QDateTime &);
void rootFileIdReceived(const qint64 fileId);

// after the above signals. with the items that actually need propagating
void aboutToPropagate(OCC::SyncFileItemVector &);
Expand Down Expand Up @@ -197,6 +198,7 @@
private slots:
void slotFolderDiscovered(bool local, const QString &folder);
void slotRootEtagReceived(const QByteArray &, const QDateTime &time);
void slotRootFileIdReceived(const qint64 fileId);

/** When the discovery phase discovers an item */
void slotItemDiscovered(const OCC::SyncFileItemPtr &item);
Expand Down Expand Up @@ -326,6 +328,8 @@
QString _localPath;
QString _remotePath;
QByteArray _remoteRootEtag;
bool _rootFileIdReceived = false;
qint64 _rootFileId = 0;
SyncJournalDb *_journal;
std::unique_ptr<DiscoveryPhase> _discoveryPhase;
QSharedPointer<OwncloudPropagator> _propagator;
Expand Down
5 changes: 5 additions & 0 deletions test/pushnotificationstestutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#include <QLoggingCategory>

Check failure on line 6 in test/pushnotificationstestutils.cpp

View workflow job for this annotation

GitHub Actions / build

test/pushnotificationstestutils.cpp:6:10 [clang-diagnostic-error]

'QLoggingCategory' file not found
#include <QSignalSpy>
#include <QTest>
#include <cstdint>
Expand Down Expand Up @@ -67,6 +67,11 @@
return nullptr;
}

// Wait for notify_file_id opt-in
if (!waitForTextMessages()) {
return nullptr;
}

afterAuthentication();

return socket;
Expand Down
Loading
Loading