From 9377ebb238999f33a1605dbf20f3a5523b65555c Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Tue, 24 Jul 2018 00:12:48 -0400 Subject: [PATCH] Keep track of user name/password authentication state --- src/Airmap/AirMapManager.cc | 26 ++++++++++---- src/Airmap/AirMapManager.h | 3 ++ src/Airmap/AirMapRulesetsManager.cc | 3 -- src/Airmap/AirMapSharedState.cc | 4 +++ src/Airmap/AirMapSharedState.h | 5 ++- src/Airmap/AirmapSettings.qml | 35 ++++++++++++++++--- .../AirspaceAdvisoryProvider.h | 2 +- src/AirspaceManagement/AirspaceManager.h | 13 +++++++ src/AirspaceManagement/AirspaceRestriction.h | 6 ++-- .../AirspaceRestrictionProvider.h | 2 +- 10 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/Airmap/AirMapManager.cc b/src/Airmap/AirMapManager.cc index fab5f23631..b2361fbffe 100644 --- a/src/Airmap/AirMapManager.cc +++ b/src/Airmap/AirMapManager.cc @@ -39,6 +39,7 @@ QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog") //----------------------------------------------------------------------------- AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox) : AirspaceManager(app, toolbox) + , _authStatus(Unknown) { _logger = std::make_shared(); qt::register_types(); // TODO: still needed? @@ -47,6 +48,7 @@ AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox) _logger->logging_category().setEnabled(QtWarningMsg, false); _dispatchingLogger = std::make_shared(_logger); connect(&_shared, &AirMapSharedState::error, this, &AirMapManager::_error); + connect(&_shared, &AirMapSharedState::authStatus, this, &AirMapManager::_authStatusChanged); } //----------------------------------------------------------------------------- @@ -87,6 +89,14 @@ AirMapManager::_error(const QString& what, const QString& airmapdMessage, const qgcApp()->showMessage(QString("AirMap Error: %1. %2").arg(what).arg(airmapdMessage)); } +//----------------------------------------------------------------------------- +void +AirMapManager::_authStatusChanged(AirspaceManager::AuthStatus status) +{ + _authStatus = status; + emit authStatusChanged(); +} + //----------------------------------------------------------------------------- void AirMapManager::_settingsChanged() @@ -97,6 +107,7 @@ AirMapManager::_settingsChanged() AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); //-- If we are disabled, there is nothing else to do. if (!ap->enableAirMap()->rawValue().toBool()) { + _shared.logout(); if(_shared.client()) { delete _shared.client(); _shared.setClient(nullptr); @@ -109,21 +120,24 @@ AirMapManager::_settingsChanged() settings.apiKey = ap->apiKey()->rawValueString(); settings.clientID = ap->clientID()->rawValueString(); } - settings.userName = ap->userName()->rawValueString(); - settings.password = ap->password()->rawValueString(); //-- If we have a hardwired key (and no custom key is present), set it. #if defined(QGC_AIRMAP_KEY_AVAILABLE) if(!ap->usePersonalApiKey()->rawValue().toBool()) { settings.apiKey = kAirmapAPIKey; settings.clientID = kAirmapClientID; } - bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); + bool authChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); #else - bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey; + bool authChanged = settings.apiKey != _shared.settings().apiKey; #endif + settings.userName = ap->userName()->rawValueString(); + settings.password = ap->password()->rawValueString(); + if(settings.userName != _shared.settings().userName || settings.password != _shared.settings().password) { + authChanged = true; + } _shared.setSettings(settings); - //-- Need to re-create the client if the API key changed - if ((_shared.client() && apiKeyChanged) || !ap->enableAirMap()->rawValue().toBool()) { + //-- Need to re-create the client if the API key or user name/password changed + if ((_shared.client() && authChanged) || !ap->enableAirMap()->rawValue().toBool()) { delete _shared.client(); _shared.setClient(nullptr); emit connectedChanged(); diff --git a/src/Airmap/AirMapManager.h b/src/Airmap/AirMapManager.h index f315c46a80..f6c56b5774 100644 --- a/src/Airmap/AirMapManager.h +++ b/src/Airmap/AirMapManager.h @@ -43,6 +43,7 @@ public: AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) override; bool connected () const override; QString connectStatus () const override { return _connectStatus; } + AirspaceManager::AuthStatus authStatus () const override { return _authStatus; } protected: AirspaceRulesetsProvider* _instantiateRulesetsProvider () override; @@ -54,12 +55,14 @@ protected: private slots: void _error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void _settingsChanged (); + void _authStatusChanged (AirspaceManager::AuthStatus status); private: QString _connectStatus; AirMapSharedState _shared; std::shared_ptr _logger; std::shared_ptr _dispatchingLogger; + AirspaceManager::AuthStatus _authStatus; }; diff --git a/src/Airmap/AirMapRulesetsManager.cc b/src/Airmap/AirMapRulesetsManager.cc index 06a63cb0c1..af54be6796 100644 --- a/src/Airmap/AirMapRulesetsManager.cc +++ b/src/Airmap/AirMapRulesetsManager.cc @@ -197,7 +197,6 @@ AirMapRuleSet::setSelected(bool sel) if(_selected != sel) { _selected = sel; emit selectedChanged(); - qDebug() << "Selection" << name() << sel; qgcApp()->toolbox()->airspaceManager()->setUpdate(); } } else { @@ -244,7 +243,6 @@ void AirMapRulesetsManager::setROI(const QGCGeoBoundingCube& roi, bool reset) for(int rs = 0; rs < ruleSets()->count(); rs++) { AirMapRuleSet* ruleSet = qobject_cast(ruleSets()->get(rs)); selectionSet[ruleSet->id()] = ruleSet->selected(); - qDebug() << ruleSet->id() << ruleSet->selected(); } _ruleSets.clearAndDeleteContents(); _state = State::RetrieveItems; @@ -277,7 +275,6 @@ void AirMapRulesetsManager::setROI(const QGCGeoBoundingCube& roi, bool reset) //-- Restore selection set (if any) if(selectionSet.contains(pRuleSet->id())) { pRuleSet->_selected = selectionSet[pRuleSet->id()]; - qDebug() << pRuleSet->name() << pRuleSet->id() << pRuleSet->_selected; } else { if(pRuleSet->_isDefault) { pRuleSet->_selected = true; diff --git a/src/Airmap/AirMapSharedState.cc b/src/Airmap/AirMapSharedState.cc index 04cbd87049..f27da2cd8d 100644 --- a/src/Airmap/AirMapSharedState.cc +++ b/src/Airmap/AirMapSharedState.cc @@ -50,10 +50,12 @@ AirMapSharedState::login() } if (result) { qCDebug(AirMapManagerLog)<<"Successfully authenticated with AirMap: id="<< result.value().id.c_str(); + emit authStatus(AirspaceManager::AuthStatus::Anonymous); _loginToken = QString::fromStdString(result.value().id); _processPendingRequests(); } else { _pendingRequests.clear(); + emit authStatus(AirspaceManager::AuthStatus::Error); QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); emit error("Failed to authenticate with AirMap", QString::fromStdString(result.error().message()), description); @@ -73,11 +75,13 @@ AirMapSharedState::login() if (result) { qCDebug(AirMapManagerLog)<<"Successfully authenticated with AirMap: id="<< result.value().id.c_str()<<", access=" < #include +#include "AirspaceManager.h" + #include /** @@ -55,7 +57,8 @@ public: const QString& loginToken () const { return _loginToken; } signals: - void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void authStatus (AirspaceManager::AuthStatus status); private: void _processPendingRequests (); diff --git a/src/Airmap/AirmapSettings.qml b/src/Airmap/AirmapSettings.qml index 3c27090ce5..15475dba6d 100644 --- a/src/Airmap/AirmapSettings.qml +++ b/src/Airmap/AirmapSettings.qml @@ -19,6 +19,7 @@ import QtLocation 5.3 import QtPositioning 5.3 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactControls 1.0 @@ -42,6 +43,7 @@ QGCView { property real _panelWidth: _qgcView.width * _internalWidthRatio property Fact _enableAirMapFact: QGroundControl.settingsManager.airMapSettings.enableAirMap property bool _airMapEnabled: _enableAirMapFact.rawValue + property var _authStatus: QGroundControl.airspaceManager.authStatus readonly property real _internalWidthRatio: 0.8 @@ -184,7 +186,8 @@ QGCView { anchors.horizontalCenter: parent.horizontalCenter GridLayout { id: loginGrid - columns: 2 + columns: 3 + columnSpacing: ScreenTools.defaultFontPixelWidth rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 anchors.centerIn: parent QGCLabel { text: qsTr("User Name:") } @@ -197,6 +200,24 @@ QGCView { Layout.minimumWidth: _editFieldWidth property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName } + QGCLabel { + text: { + if(!QGroundControl.airspaceManager.connected) + return qsTr("Not Connected") + switch(_authStatus) { + case AirspaceManager.Unknown: + return qsTr("") + case AirspaceManager.Anonymous: + return qsTr("Anonymous") + case AirspaceManager.Autheticated: + return qsTr("Autheticated") + default: + return qsTr("Authetication Error") + } + } + Layout.rowSpan: 2 + Layout.alignment: Qt.AlignVCenter + } QGCLabel { text: qsTr("Password:") } FactTextField { fact: _passwordFact @@ -211,22 +232,26 @@ QGCView { Item { width: 1 height: 1 - Layout.columnSpan: 2 + } + Item { + width: 1 + height: 1 + Layout.columnSpan: 3 } QGCLabel { text: qsTr("Forgot Your AirMap Password?") Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 + Layout.columnSpan: 3 } Item { width: 1 height: 1 - Layout.columnSpan: 2 + Layout.columnSpan: 3 } QGCButton { text: qsTr("Register for an AirMap Account") Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 + Layout.columnSpan: 3 enabled: _airMapEnabled onClicked: { Qt.openUrlExternally("https://www.airmap.com"); diff --git a/src/AirspaceManagement/AirspaceAdvisoryProvider.h b/src/AirspaceManagement/AirspaceAdvisoryProvider.h index 18fd05726b..11bcaff8b0 100644 --- a/src/AirspaceManagement/AirspaceAdvisoryProvider.h +++ b/src/AirspaceManagement/AirspaceAdvisoryProvider.h @@ -81,7 +81,7 @@ public: Q_ENUM(AdvisoryType) - AirspaceAdvisory (QObject* parent = NULL); + AirspaceAdvisory (QObject* parent = nullptr); Q_PROPERTY(QString id READ id CONSTANT) Q_PROPERTY(QString name READ name CONSTANT) diff --git a/src/AirspaceManagement/AirspaceManager.h b/src/AirspaceManagement/AirspaceManager.h index 1d3ecc7e56..7d3ffa4de3 100644 --- a/src/AirspaceManagement/AirspaceManager.h +++ b/src/AirspaceManagement/AirspaceManager.h @@ -57,6 +57,15 @@ public: AirspaceManager(QGCApplication* app, QGCToolbox* toolbox); virtual ~AirspaceManager() override; + enum AuthStatus { + Unknown, + Anonymous, + Autheticated, + Error + }; + + Q_ENUM(AuthStatus) + Q_PROPERTY(QString providerName READ providerName CONSTANT) Q_PROPERTY(AirspaceWeatherInfoProvider* weatherInfo READ weatherInfo CONSTANT) Q_PROPERTY(AirspaceAdvisoryProvider* advisories READ advisories CONSTANT) @@ -65,6 +74,7 @@ public: Q_PROPERTY(AirspaceFlightPlanProvider* flightPlan READ flightPlan CONSTANT) Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) Q_PROPERTY(QString connectStatus READ connectStatus NOTIFY connectStatusChanged) + Q_PROPERTY(AirspaceManager::AuthStatus authStatus READ authStatus NOTIFY authStatusChanged) Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setAirspaceVisible NOTIFY airspaceVisibleChanged) Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset = false); @@ -85,6 +95,8 @@ public: virtual QString connectStatus () const { return QString(); } virtual void setUpdate (); + virtual AirspaceManager::AuthStatus authStatus () const { return Anonymous; } + /** * Factory method to create an AirspaceVehicleManager object */ @@ -94,6 +106,7 @@ signals: void airspaceVisibleChanged (); void connectedChanged (); void connectStatusChanged (); + void authStatusChanged (); void update (); protected: diff --git a/src/AirspaceManagement/AirspaceRestriction.h b/src/AirspaceManagement/AirspaceRestriction.h index 4cd8c48f6d..e160e1b3fb 100644 --- a/src/AirspaceManagement/AirspaceRestriction.h +++ b/src/AirspaceManagement/AirspaceRestriction.h @@ -22,7 +22,7 @@ class AirspaceRestriction : public QObject { Q_OBJECT public: - AirspaceRestriction(QObject* parent = NULL); + AirspaceRestriction(QObject* parent = nullptr); }; /** @@ -34,7 +34,7 @@ class AirspacePolygonRestriction : public AirspaceRestriction { Q_OBJECT public: - AirspacePolygonRestriction(const QVariantList& polygon, QObject* parent = NULL); + AirspacePolygonRestriction(const QVariantList& polygon, QObject* parent = nullptr); Q_PROPERTY(QVariantList polygon MEMBER _polygon CONSTANT) @@ -53,7 +53,7 @@ class AirspaceCircularRestriction : public AirspaceRestriction { Q_OBJECT public: - AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QObject* parent = NULL); + AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QObject* parent = nullptr); Q_PROPERTY(QGeoCoordinate center MEMBER _center CONSTANT) Q_PROPERTY(double radius MEMBER _radius CONSTANT) diff --git a/src/AirspaceManagement/AirspaceRestrictionProvider.h b/src/AirspaceManagement/AirspaceRestrictionProvider.h index 4882fd1de5..f94dff845a 100644 --- a/src/AirspaceManagement/AirspaceRestrictionProvider.h +++ b/src/AirspaceManagement/AirspaceRestrictionProvider.h @@ -27,7 +27,7 @@ class AirspaceCircularRestriction; class AirspaceRestrictionProvider : public QObject { Q_OBJECT public: - AirspaceRestrictionProvider (QObject* parent = NULL); + AirspaceRestrictionProvider (QObject* parent = nullptr); ~AirspaceRestrictionProvider () = default; Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT) -- GitLab