added authentication failure handling

master
Boernsman 2020-02-14 15:53:30 +05:00 committed by bernhard.trinnes
parent 11c978191f
commit 33aec78f57
3 changed files with 29 additions and 14 deletions

View File

@ -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,17 +268,23 @@ void DevicePluginDoorbird::onDoorBirdEvent(Doorbird::EventType eventType, bool s
void DevicePluginDoorbird::onDoorBirdRequestSent(QUuid requestId, bool success)
{
Doorbird *doorbird = static_cast<Doorbird *>(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);
}
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)
{
Q_UNUSED(sessionId);

View File

@ -62,9 +62,16 @@ 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);
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;
}

View File

@ -93,6 +93,8 @@ private:
QHostAddress m_address;
QList<QNetworkReply *> m_networkRequests;
QList<QNetworkReply *> m_pendingAuthentications;
//QByteArray sessionId;
signals: