From 33aec78f572b7f62b82e539ff297057a338b41db Mon Sep 17 00:00:00 2001 From: Boernsman Date: Fri, 14 Feb 2020 15:53:30 +0500 Subject: [PATCH] added authentication failure handling --- doorbird/deviceplugindoorbird.cpp | 23 ++++++++++++++--------- doorbird/doorbird.cpp | 18 +++++++++++++----- doorbird/doorbird.h | 2 ++ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/doorbird/deviceplugindoorbird.cpp b/doorbird/deviceplugindoorbird.cpp index aea749c6..6e8fe3d4 100644 --- a/doorbird/deviceplugindoorbird.cpp +++ b/doorbird/deviceplugindoorbird.cpp @@ -113,7 +113,6 @@ void DevicePluginDoorbird::confirmPairing(DevicePairingInfo *info, const QString connect(doorbird, &Doorbird::requestSent, this, &DevicePluginDoorbird::onDoorBirdRequestSent); connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived); doorbird->initConnection(username, password); - doorbird->connectToEventMonitor(); m_doorbirdConnections.insert(info->deviceId(), doorbird); m_pendingPairings.insert(doorbird, info); doorbird->getSession(); @@ -159,7 +158,6 @@ void DevicePluginDoorbird::setupDevice(DeviceSetupInfo *info) connect(doorbird, &Doorbird::requestSent, this, &DevicePluginDoorbird::onDoorBirdRequestSent); connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived); doorbird->initConnection(username, password); - doorbird->connectToEventMonitor(); m_doorbirdConnections.insert(device->id(), doorbird); m_pendingDeviceSetups.insert(doorbird, info); doorbird->getSession(); @@ -183,6 +181,7 @@ void DevicePluginDoorbird::postSetupDevice(Device *device) if (device->deviceClassId() == doorBirdDeviceClassId) { device->setStateValue(doorBirdConnectedStateTypeId, true); //since we checked the connection in the deviceSetup Doorbird *doorbird = m_doorbirdConnections.value(device->id()); + doorbird->connectToEventMonitor(); doorbird->infoRequest(); doorbird->listFavorites(); doorbird->listSchedules(); @@ -269,15 +268,21 @@ void DevicePluginDoorbird::onDoorBirdEvent(Doorbird::EventType eventType, bool s void DevicePluginDoorbird::onDoorBirdRequestSent(QUuid requestId, bool success) { Doorbird *doorbird = static_cast(sender()); - Device *device = myDevices().findById(m_doorbirdConnections.key(doorbird)); - if (!device) - return; - if (!m_asyncActions.contains(requestId)) - return; + if (m_asyncActions.contains(requestId)) { + DeviceActionInfo* actionInfo = m_asyncActions.take(requestId); + actionInfo->finish(success ? Device::DeviceErrorNoError : Device::DeviceErrorInvalidParameter); + } - DeviceActionInfo* actionInfo = m_asyncActions.take(requestId); - actionInfo->finish(success ? Device::DeviceErrorNoError : Device::DeviceErrorInvalidParameter); + if (m_pendingPairings.contains(doorbird) && !success) { + DevicePairingInfo *info = m_pendingPairings.take(doorbird); + info->finish(Device::DeviceErrorAuthenticationFailure, tr("Wrong username or password")); + } + + if (m_pendingDeviceSetups.contains(doorbird) && !success) { + DeviceSetupInfo *info = m_pendingDeviceSetups.take(doorbird); + info->finish(Device::DeviceErrorAuthenticationFailure, tr("Wrong username or password")); + } } void DevicePluginDoorbird::onSessionIdReceived(const QString &sessionId) diff --git a/doorbird/doorbird.cpp b/doorbird/doorbird.cpp index 2db09e10..2b399619 100644 --- a/doorbird/doorbird.cpp +++ b/doorbird/doorbird.cpp @@ -61,10 +61,17 @@ void Doorbird::setAddress(const QHostAddress &address) void Doorbird::initConnection(const QString &username, const QString &password) { m_networkAccessManager = new QNetworkAccessManager(this); - connect(m_networkAccessManager, &QNetworkAccessManager::authenticationRequired, this, [username, password, this](QNetworkReply *reply, QAuthenticator *authenticator) { - Q_UNUSED(reply); - authenticator->setUser(username); - authenticator->setPassword(password); + connect(m_networkAccessManager, &QNetworkAccessManager::authenticationRequired, this, [username, password, this] (QNetworkReply *reply, QAuthenticator *authenticator) { + + qCWarning(dcDoorBird()) << "Authenticator" << reply->errorString() << reply->error(); + if (m_pendingAuthentications.contains(reply)) { + m_pendingAuthentications.removeOne(reply); + reply->abort(); + } else { + authenticator->setUser(username); + authenticator->setPassword(password); + m_pendingAuthentications.append(reply); + } }); } @@ -79,7 +86,7 @@ QUuid Doorbird::getSession() reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcDoorBird) << "Error DoorBird device"; + qCWarning(dcDoorBird) << "Error DoorBird device:" << reply->errorString(); emit requestSent(requestId, false); return; } @@ -98,6 +105,7 @@ QUuid Doorbird::getSession() emit sessionIdReceived(sessionId); } }); + return requestId; } diff --git a/doorbird/doorbird.h b/doorbird/doorbird.h index 163e9516..0d519412 100644 --- a/doorbird/doorbird.h +++ b/doorbird/doorbird.h @@ -93,6 +93,8 @@ private: QHostAddress m_address; QList m_networkRequests; + QList m_pendingAuthentications; + //QByteArray sessionId; signals: