diff options
Diffstat (limited to 'src/qt')
| -rw-r--r-- | src/qt/prices.cpp | 110 | ||||
| -rw-r--r-- | src/qt/prices.h | 30 | ||||
| -rw-r--r-- | src/qt/utils.cpp | 81 | ||||
| -rw-r--r-- | src/qt/utils.h | 1 |
4 files changed, 222 insertions, 0 deletions
diff --git a/src/qt/prices.cpp b/src/qt/prices.cpp new file mode 100644 index 00000000..b85899cf --- /dev/null +++ b/src/qt/prices.cpp @@ -0,0 +1,110 @@ +// Copyright (c) 2014-2019, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include <QtCore> +#include <QNetworkAccessManager> + +#include "utils.h" +#include "prices.h" + + +Prices::Prices(QNetworkAccessManager *networkAccessManager, QObject *parent) + : QObject(parent) { + this->m_networkAccessManager = networkAccessManager; +} + +void Prices::getJSON(const QString url) { + qDebug() << QString("Fetching: %1").arg(url); + QNetworkRequest request; + request.setUrl(QUrl(url)); + request.setRawHeader("User-Agent", randomUserAgent().toUtf8()); + request.setRawHeader("Content-Type", "application/json"); + + m_reply = this->m_networkAccessManager->get(request); + + connect(m_reply, SIGNAL(finished()), this, SLOT(gotJSON())); +} + +void Prices::gotJSON() { + // Check connectivity + if (!m_reply || m_reply->error() != QNetworkReply::NoError){ + this->gotError(); + m_reply->deleteLater(); + return; + } + + // Check json header + QList<QByteArray> headerList = m_reply->rawHeaderList(); + QByteArray headerJson = m_reply->rawHeader("Content-Type"); + if(headerJson.length() <= 15){ + this->gotError("Bad Content-Type"); + m_reply->deleteLater(); + return; + } + + QString headerJsonStr = QTextCodec::codecForMib(106)->toUnicode(headerJson); + int _contentType = headerList.indexOf("Content-Type"); + if (_contentType < 0 || !headerJsonStr.startsWith("application/json")){ + this->gotError("Bad Content-Type"); + m_reply->deleteLater(); + return; + } + + // Check valid json document + QByteArray data = m_reply->readAll(); + QJsonDocument doc = QJsonDocument::fromJson(data); + QString jsonString = doc.toJson(QJsonDocument::Indented); + if (jsonString.isEmpty()){ + this->gotError("Bad JSON"); + m_reply->deleteLater(); + return; + } + + // Insert source url for later reference + QUrl url = m_reply->url(); + QJsonObject docobj = doc.object(); + docobj["_url"] = url.toString(); + doc.setObject(docobj); + + qDebug() << QString("Fetched: %1").arg(url.toString()); + + // Emit signal + QVariantMap vMap = doc.object().toVariantMap(); + emit priceJsonReceived(vMap); + + m_reply->deleteLater(); +} + +void Prices::gotError() { + this->gotError("Unknown error"); +} + +void Prices::gotError(const QString &message) { + qCritical() << __FUNCTION__ << ": Error: " << message; + emit priceJsonError(message); +} diff --git a/src/qt/prices.h b/src/qt/prices.h new file mode 100644 index 00000000..334fd9dc --- /dev/null +++ b/src/qt/prices.h @@ -0,0 +1,30 @@ +#ifndef PRICES_H +#define PRICES_H + +#include <QCoreApplication> +#include <QtNetwork> +#include <QNetworkAccessManager> +#include <QNetworkReply> +#include <QDebug> + +class Prices : public QObject +{ +Q_OBJECT +public: + Prices(QNetworkAccessManager *networkAccessManager, QObject *parent = nullptr); + +public slots: + Q_INVOKABLE void getJSON(const QString url); + void gotJSON(); + void gotError(); + void gotError(const QString &message); +signals: + void priceJsonReceived(QVariantMap document); + void priceJsonError(QString message); + +private: + mutable QPointer<QNetworkReply> m_reply; + QNetworkAccessManager *m_networkAccessManager; +}; + +#endif // PRICES_H diff --git a/src/qt/utils.cpp b/src/qt/utils.cpp index 7c6d4b02..2407a50e 100644 --- a/src/qt/utils.cpp +++ b/src/qt/utils.cpp @@ -46,3 +46,84 @@ QString getAccountName(){ accountName = "My monero Account"; return accountName; } + +QString randomUserAgent(){ + QStringList urand; + urand << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1" + << "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" + << "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0" + << "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0" + << "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0" + << "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0" + << "Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3" + << "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0" + << "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0" + << "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" + << "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0" + << "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0" + << "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0" + << "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0" + << "Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0" + << "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1" + << "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0" + << "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0" + << "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0" + << "Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0" + << "Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" + << "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6" + << "Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0" + << "Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1" + << "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1" + << "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1" + << "Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0" + << "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2" + << "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20120427 Firefox/15.0a1" + << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1" + << "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:15.0) Gecko/20120910144328 Firefox/15.0.2" + << "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1" + << "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:15.0) Gecko/20121011 Firefox/15.0.1" + << "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1" + << "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1" + << "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20120405 Firefox/14.0a1" + << "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" + << "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1" + << "Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; en-US; rv:2.0.4) Gecko/20120718 AskTbAVR-IDW/3.12.5.17700 Firefox/14.0.1" + << "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/14.0.1" + << "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/ 20120405 Firefox/14.0.1" + << "Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1" + << "Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1" + << "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0" + << "Mozilla/5.0 (Windows NT 6.1; de;rv:12.0) Gecko/20120403211507 Firefox/12.0"; + + // @TODO: Qt 5.10 - QRandomGenerator + int irand = rand() % urand.length(); + return urand.at(irand); +} diff --git a/src/qt/utils.h b/src/qt/utils.h index 9d798b8e..c18ffdc1 100644 --- a/src/qt/utils.h +++ b/src/qt/utils.h @@ -35,5 +35,6 @@ bool fileExists(QString path); QString getAccountName(); const static QRegExp reURI = QRegExp("^\\w+:\\/\\/([\\w+\\-?\\-_\\-=\\-&]+)"); +QString randomUserAgent(); #endif // UTILS_H |
