From 5c3e3464c2ccf960ef3aaee4286f3d5b4cde12ac Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Thu, 14 Mar 2019 13:52:33 +0100 Subject: Display a notice when requesting a SSL map type without SSL support Some plugins request map data for some map types over HTTPS. Without SSL support (Qt built without SSL support, or missing OpenSSL libraries) this typically translates into blank maps. This is very evident on the MapViewer example. This patch makes sure that the example displays a notice when this situation happens. [ChangeLog] Added a notice to the MapViewer example to inform when a HTTPS-based map is selected without SSL support. Change-Id: I85428bb0536f33089a0e6045301c089fafe69d74 Fixes: QTBUG-74195 Fixes: QTBUG-74294 Reviewed-by: Eskil Abrahamsen Blomfeldt --- examples/location/mapviewer/main.cpp | 3 ++ examples/location/mapviewer/mapviewer.qml | 13 ++++++++ .../mapboxgl/qgeomappingmanagerenginemapboxgl.cpp | 39 +++++++++++++--------- .../geoservices/osm/qgeotileproviderosm.cpp | 24 ++++++++++++- src/plugins/geoservices/osm/qgeotileproviderosm.h | 1 + 5 files changed, 63 insertions(+), 17 deletions(-) diff --git a/examples/location/mapviewer/main.cpp b/examples/location/mapviewer/main.cpp index 73bc937b..39c117ed 100644 --- a/examples/location/mapviewer/main.cpp +++ b/examples/location/mapviewer/main.cpp @@ -52,6 +52,8 @@ #include #include #include +#include +#include static bool parseArgs(QStringList& args, QVariantMap& parameters) { @@ -131,6 +133,7 @@ int main(int argc, char *argv[]) parameters[QStringLiteral("osm.useragent")] = QStringLiteral("QtLocation Mapviewer example"); QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("supportsSsl", QSslSocket::supportsSsl()); engine.addImportPath(QStringLiteral(":/imports")); engine.load(QUrl(QStringLiteral("qrc:///mapviewer.qml"))); QObject::connect(&engine, SIGNAL(quit()), qApp, SLOT(quit())); diff --git a/examples/location/mapviewer/mapviewer.qml b/examples/location/mapviewer/mapviewer.qml index e97076ab..e8b016aa 100644 --- a/examples/location/mapviewer/mapviewer.qml +++ b/examples/location/mapviewer/mapviewer.qml @@ -429,6 +429,19 @@ ApplicationWindow { focus: true initialItem: Item { id: page + + Text { + visible: !supportsSsl && map && map.activeMapType && activeMapType.metadata.isHTTPS + text: "The active map type\n +requires (missing) SSL\n +support" + horizontalAlignment: Text.AlignHCenter + font.pixelSize: appWindow.width / 12 + font.bold: true + color: "grey" + anchors.centerIn: parent + z: 12 + } } function showMessage(title,message,backPage) diff --git a/src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.cpp b/src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.cpp index d2463106..5cbde041 100644 --- a/src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.cpp +++ b/src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.cpp @@ -73,40 +73,43 @@ QGeoMappingManagerEngineMapboxGL::QGeoMappingManagerEngineMapboxGL(const QVarian m_useChinaEndpoint = parameters.value(QStringLiteral("mapboxgl.china")).toBool(); } + QVariantMap metadata; + metadata["isHTTPS"] = true; + if (m_useChinaEndpoint) { m_settings.setApiBaseUrl(QStringLiteral("https://api.mapbox.cn")); mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-zh-v1"), - tr("China Streets"), false, false, ++mapId, pluginName, cameraCaps); + tr("China Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-zh-v1"), - tr("China Light"), false, false, ++mapId, pluginName, cameraCaps); + tr("China Light"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-zh-v1"), - tr("China Dark"), false, false, ++mapId, pluginName, cameraCaps); + tr("China Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata); } else { mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-v10"), - tr("Streets"), false, false, ++mapId, pluginName, cameraCaps); + tr("Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/basic-v9"), - tr("Basic"), false, false, ++mapId, pluginName, cameraCaps); + tr("Basic"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/bright-v9"), - tr("Bright"), false, false, ++mapId, pluginName, cameraCaps); + tr("Bright"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::TerrainMap, QStringLiteral("mapbox://styles/mapbox/outdoors-v10"), - tr("Outdoors"), false, false, ++mapId, pluginName, cameraCaps); + tr("Outdoors"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, QStringLiteral("mapbox://styles/mapbox/satellite-v9"), - tr("Satellite"), false, false, ++mapId, pluginName, cameraCaps); + tr("Satellite"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::HybridMap, QStringLiteral("mapbox://styles/mapbox/satellite-streets-v10"), - tr("Satellite Streets"), false, false, ++mapId, pluginName, cameraCaps); + tr("Satellite Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-v9"), - tr("Light"), false, false, ++mapId, pluginName, cameraCaps); + tr("Light"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-v9"), - tr("Dark"), false, false, ++mapId, pluginName, cameraCaps); + tr("Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-day-v2"), - tr("Navigation Preview Day"), false, false, ++mapId, pluginName, cameraCaps); + tr("Navigation Preview Day"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-night-v2"), - tr("Navigation Preview Night"), false, true, ++mapId, pluginName, cameraCaps); + tr("Navigation Preview Night"), false, true, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-day-v2"), - tr("Navigation Guidance Day"), false, false, ++mapId, pluginName, cameraCaps); + tr("Navigation Guidance Day"), false, false, ++mapId, pluginName, cameraCaps, metadata); mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-night-v2"), - tr("Navigation Guidance Night"), false, true, ++mapId, pluginName, cameraCaps); + tr("Navigation Guidance Night"), false, true, ++mapId, pluginName, cameraCaps, metadata); } if (parameters.contains(QStringLiteral("mapboxgl.mapping.additional_style_urls"))) { @@ -116,9 +119,13 @@ QGeoMappingManagerEngineMapboxGL::QGeoMappingManagerEngineMapboxGL(const QVarian for (auto it = idList.crbegin(), end = idList.crend(); it != end; ++it) { if ((*it).isEmpty()) continue; + if ((*it).startsWith(QStringLiteral("http:"))) + metadata["isHTTPS"] = false; + else + metadata["isHTTPS"] = true; mapTypes.prepend(QGeoMapType(QGeoMapType::CustomMap, *it, - tr("User provided style"), false, false, ++mapId, pluginName, cameraCaps)); + tr("User provided style"), false, false, ++mapId, pluginName, cameraCaps, metadata)); } } diff --git a/src/plugins/geoservices/osm/qgeotileproviderosm.cpp b/src/plugins/geoservices/osm/qgeotileproviderosm.cpp index f7ab8c99..e0008068 100644 --- a/src/plugins/geoservices/osm/qgeotileproviderosm.cpp +++ b/src/plugins/geoservices/osm/qgeotileproviderosm.cpp @@ -45,6 +45,16 @@ QT_BEGIN_NAMESPACE static const int maxValidZoom = 30; static const QDateTime defaultTs = QDateTime::fromString(QStringLiteral("2016-06-01T00:00:00"), Qt::ISODate); +static void setSSL(QGeoMapType &mapType, bool isHTTPS) +{ + QVariantMap metadata = mapType.metadata(); + metadata["isHTTPS"] = isHTTPS; + + mapType = QGeoMapType(mapType.style(), mapType.name(), mapType.description(), mapType.mobile(), + mapType.night(), mapType.mapId(), mapType.pluginName(), mapType.cameraCapabilities(), + metadata); +} + QGeoTileProviderOsm::QGeoTileProviderOsm(QNetworkAccessManager *nm, const QGeoMapType &mapType, const QVector &providers, @@ -61,6 +71,9 @@ QGeoTileProviderOsm::QGeoTileProviderOsm(QNetworkAccessManager *nm, if (!m_provider || m_provider->isValid()) m_status = Resolved; + if (m_provider && m_provider->isValid()) + setSSL(m_mapType, m_provider->isHTTPS()); + connect(this, &QGeoTileProviderOsm::resolutionFinished, this, &QGeoTileProviderOsm::updateCameraCapabilities); } @@ -237,7 +250,11 @@ void QGeoTileProviderOsm::updateCameraCapabilities() m_cameraCapabilities.setMaximumZoomLevel(maximumZoomLevel()); m_mapType = QGeoMapType(m_mapType.style(), m_mapType.name(), m_mapType.description(), m_mapType.mobile(), - m_mapType.night(), m_mapType.mapId(), m_mapType.pluginName(), m_cameraCapabilities); + m_mapType.night(), m_mapType.mapId(), m_mapType.pluginName(), m_cameraCapabilities, + m_mapType.metadata()); + + if (m_provider && m_provider->isValid()) + setSSL(m_mapType, m_provider->isHTTPS()); } void QGeoTileProviderOsm::addProvider(TileProvider *provider) @@ -604,6 +621,11 @@ bool TileProvider::isHighDpi() const return m_highDpi; } +bool TileProvider::isHTTPS() const +{ + return m_urlTemplate.startsWith(QStringLiteral("https")); +} + void TileProvider::setStyleCopyRight(const QString ©right) { m_copyRightStyle = copyright; diff --git a/src/plugins/geoservices/osm/qgeotileproviderosm.h b/src/plugins/geoservices/osm/qgeotileproviderosm.h index 54f8049d..ab4e2294 100644 --- a/src/plugins/geoservices/osm/qgeotileproviderosm.h +++ b/src/plugins/geoservices/osm/qgeotileproviderosm.h @@ -93,6 +93,7 @@ public: inline int maximumZoomLevel() const; inline const QDateTime ×tamp() const; inline bool isHighDpi() const; + inline bool isHTTPS() const; QUrl tileAddress(int x, int y, int z) const; // Optional properties, not needed to construct a provider -- cgit v1.2.3