Commit 9377ebb2 authored by Gus Grubba's avatar Gus Grubba

Keep track of user name/password authentication state

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