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::requestSent, this, &DevicePluginDoorbird::onDoorBirdRequestSent);
connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived); connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived);
doorbird->initConnection(username, password); doorbird->initConnection(username, password);
doorbird->connectToEventMonitor();
m_doorbirdConnections.insert(info->deviceId(), doorbird); m_doorbirdConnections.insert(info->deviceId(), doorbird);
m_pendingPairings.insert(doorbird, info); m_pendingPairings.insert(doorbird, info);
doorbird->getSession(); doorbird->getSession();
@ -159,7 +158,6 @@ void DevicePluginDoorbird::setupDevice(DeviceSetupInfo *info)
connect(doorbird, &Doorbird::requestSent, this, &DevicePluginDoorbird::onDoorBirdRequestSent); connect(doorbird, &Doorbird::requestSent, this, &DevicePluginDoorbird::onDoorBirdRequestSent);
connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived); connect(doorbird, &Doorbird::sessionIdReceived, this, &DevicePluginDoorbird::onSessionIdReceived);
doorbird->initConnection(username, password); doorbird->initConnection(username, password);
doorbird->connectToEventMonitor();
m_doorbirdConnections.insert(device->id(), doorbird); m_doorbirdConnections.insert(device->id(), doorbird);
m_pendingDeviceSetups.insert(doorbird, info); m_pendingDeviceSetups.insert(doorbird, info);
doorbird->getSession(); doorbird->getSession();
@ -183,6 +181,7 @@ void DevicePluginDoorbird::postSetupDevice(Device *device)
if (device->deviceClassId() == doorBirdDeviceClassId) { if (device->deviceClassId() == doorBirdDeviceClassId) {
device->setStateValue(doorBirdConnectedStateTypeId, true); //since we checked the connection in the deviceSetup device->setStateValue(doorBirdConnectedStateTypeId, true); //since we checked the connection in the deviceSetup
Doorbird *doorbird = m_doorbirdConnections.value(device->id()); Doorbird *doorbird = m_doorbirdConnections.value(device->id());
doorbird->connectToEventMonitor();
doorbird->infoRequest(); doorbird->infoRequest();
doorbird->listFavorites(); doorbird->listFavorites();
doorbird->listSchedules(); doorbird->listSchedules();
@ -269,15 +268,21 @@ void DevicePluginDoorbird::onDoorBirdEvent(Doorbird::EventType eventType, bool s
void DevicePluginDoorbird::onDoorBirdRequestSent(QUuid requestId, bool success) void DevicePluginDoorbird::onDoorBirdRequestSent(QUuid requestId, bool success)
{ {
Doorbird *doorbird = static_cast<Doorbird *>(sender()); Doorbird *doorbird = static_cast<Doorbird *>(sender());
Device *device = myDevices().findById(m_doorbirdConnections.key(doorbird));
if (!device)
return;
if (!m_asyncActions.contains(requestId)) if (m_asyncActions.contains(requestId)) {
return; DeviceActionInfo* actionInfo = m_asyncActions.take(requestId);
actionInfo->finish(success ? Device::DeviceErrorNoError : Device::DeviceErrorInvalidParameter);
}
DeviceActionInfo* actionInfo = m_asyncActions.take(requestId); if (m_pendingPairings.contains(doorbird) && !success) {
actionInfo->finish(success ? Device::DeviceErrorNoError : Device::DeviceErrorInvalidParameter); 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) void DevicePluginDoorbird::onSessionIdReceived(const QString &sessionId)

View File

@ -61,10 +61,17 @@ void Doorbird::setAddress(const QHostAddress &address)
void Doorbird::initConnection(const QString &username, const QString &password) void Doorbird::initConnection(const QString &username, const QString &password)
{ {
m_networkAccessManager = new QNetworkAccessManager(this); m_networkAccessManager = new QNetworkAccessManager(this);
connect(m_networkAccessManager, &QNetworkAccessManager::authenticationRequired, this, [username, password, this](QNetworkReply *reply, QAuthenticator *authenticator) { connect(m_networkAccessManager, &QNetworkAccessManager::authenticationRequired, this, [username, password, this] (QNetworkReply *reply, QAuthenticator *authenticator) {
Q_UNUSED(reply);
authenticator->setUser(username); qCWarning(dcDoorBird()) << "Authenticator" << reply->errorString() << reply->error();
authenticator->setPassword(password); 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(); reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcDoorBird) << "Error DoorBird device"; qCWarning(dcDoorBird) << "Error DoorBird device:" << reply->errorString();
emit requestSent(requestId, false); emit requestSent(requestId, false);
return; return;
} }
@ -98,6 +105,7 @@ QUuid Doorbird::getSession()
emit sessionIdReceived(sessionId); emit sessionIdReceived(sessionId);
} }
}); });
return requestId; return requestId;
} }

View File

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