From 091a6272d25d5242d2c6e63a0646536366fb0e42 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 19 Dec 2024 08:58:04 +1000 Subject: [PATCH] Don't support the fascist hellsite --- .github/workflows/build.yml | 1 - .../workflows/clang_static_analyzer/start.sh | 1 - .github/workflows/codeql.yml | 1 - .github/workflows/coverity-scan.yml | 1 - .github/workflows/mac/install.sh | 1 - CMakeLists.txt | 6 +- README.md | 4 - examples/CMakeLists.txt | 4 - examples/sialis/.gitignore | 73 ---------- examples/sialis/README.md | 13 -- examples/sialis/deployment.pri | 13 -- examples/sialis/main.cpp | 22 --- examples/sialis/main.qml | 129 ----------------- examples/sialis/qml.qrc | 5 - examples/sialis/sialis.icns | Bin 32370 -> 0 bytes examples/sialis/sialis.pro | 25 ---- examples/sialis/tweetmodel.cpp | 40 ------ examples/sialis/tweetmodel.h | 38 ----- examples/sialis/twitterapi.cpp | 58 -------- examples/sialis/twitterapi.h | 46 ------ examples/twitterdemo/CMakeLists.txt | 25 ---- examples/twitterdemo/main.cpp | 115 --------------- examples/twitterdemo/tweeter.cpp | 135 ------------------ examples/twitterdemo/tweeter.h | 41 ------ examples/twitterdemo/twitterdemo.pro | 15 -- o2-config.h.cmake | 1 - src/CMakeLists.txt | 12 -- src/o1twitter.h | 19 --- src/oxtwitter.cpp | 77 ---------- src/oxtwitter.h | 38 ----- src/src.pri | 5 - 31 files changed, 1 insertion(+), 963 deletions(-) delete mode 100644 examples/sialis/.gitignore delete mode 100644 examples/sialis/README.md delete mode 100644 examples/sialis/deployment.pri delete mode 100644 examples/sialis/main.cpp delete mode 100644 examples/sialis/main.qml delete mode 100644 examples/sialis/qml.qrc delete mode 100644 examples/sialis/sialis.icns delete mode 100644 examples/sialis/sialis.pro delete mode 100644 examples/sialis/tweetmodel.cpp delete mode 100644 examples/sialis/tweetmodel.h delete mode 100644 examples/sialis/twitterapi.cpp delete mode 100644 examples/sialis/twitterapi.h delete mode 100644 examples/twitterdemo/CMakeLists.txt delete mode 100644 examples/twitterdemo/main.cpp delete mode 100644 examples/twitterdemo/tweeter.cpp delete mode 100644 examples/twitterdemo/tweeter.h delete mode 100644 examples/twitterdemo/twitterdemo.pro delete mode 100644 src/o1twitter.h delete mode 100644 src/oxtwitter.cpp delete mode 100644 src/oxtwitter.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57ed038..5388faf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,6 @@ jobs: -Do2_WITH_SMUGMUG:BOOL=ON \ -Do2_WITH_SPOTIFY:BOOL=ON \ -Do2_WITH_SURVEYMONKEY:BOOL=ON \ - -Do2_WITH_TWITTER:BOOL=ON \ -Do2_WITH_UBER:BOOL=ON \ -Do2_WITH_VIMEO:BOOL=ON \ -S . \ diff --git a/.github/workflows/clang_static_analyzer/start.sh b/.github/workflows/clang_static_analyzer/start.sh index 4bbaf59..bc53c4a 100755 --- a/.github/workflows/clang_static_analyzer/start.sh +++ b/.github/workflows/clang_static_analyzer/start.sh @@ -37,7 +37,6 @@ scan-build -o scanbuildoutput -plist -v cmake -Do2_BUILD_EXAMPLES:BOOL=ON \ -Do2_WITH_SMUGMUG:BOOL=ON \ -Do2_WITH_SPOTIFY:BOOL=ON \ -Do2_WITH_SURVEYMONKEY:BOOL=ON \ - -Do2_WITH_TWITTER:BOOL=ON \ -Do2_WITH_UBER:BOOL=ON \ -Do2_WITH_VIMEO:BOOL=ON \ .. diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 455e1e4..1242c26 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -103,7 +103,6 @@ jobs: -Do2_WITH_SMUGMUG:BOOL=ON \ -Do2_WITH_SPOTIFY:BOOL=ON \ -Do2_WITH_SURVEYMONKEY:BOOL=ON \ - -Do2_WITH_TWITTER:BOOL=ON \ -Do2_WITH_UBER:BOOL=ON \ -Do2_WITH_VIMEO:BOOL=ON make -j$(nproc) diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index e2d5446..1ec35d4 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -41,7 +41,6 @@ jobs: -Do2_WITH_SMUGMUG:BOOL=ON \ -Do2_WITH_SPOTIFY:BOOL=ON \ -Do2_WITH_SURVEYMONKEY:BOOL=ON \ - -Do2_WITH_TWITTER:BOOL=ON \ -Do2_WITH_UBER:BOOL=ON \ -Do2_WITH_VIMEO:BOOL=ON \ - name: Download Coverity Build Tool diff --git a/.github/workflows/mac/install.sh b/.github/workflows/mac/install.sh index c630c05..5f12174 100644 --- a/.github/workflows/mac/install.sh +++ b/.github/workflows/mac/install.sh @@ -31,7 +31,6 @@ cmake -GNinja \ -Do2_WITH_SMUGMUG:BOOL=ON \ -Do2_WITH_SPOTIFY:BOOL=ON \ -Do2_WITH_SURVEYMONKEY:BOOL=ON \ - -Do2_WITH_TWITTER:BOOL=ON \ -Do2_WITH_UBER:BOOL=ON \ -Do2_WITH_VIMEO:BOOL=ON \ .. diff --git a/CMakeLists.txt b/CMakeLists.txt index 01fdd05..c88a865 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,6 @@ if(NOT o2_SHOW_TRACE) endif() option(o2_WITH_TESTS "Enable tests" OFF) -option(o2_WITH_TWITTER "Authenticate with Twitter" OFF) option(o2_WITH_DROPBOX "Authenticate with Dropbox" OFF) option(o2_WITH_GOOGLE "Authenticate with Google" OFF) option(o2_WITH_VIMEO "Authenticate with Vimeo" OFF) @@ -45,9 +44,6 @@ option(o2_WITH_KEYCHAIN "keychain store" ON) option(o2_WITH_OAUTH1 "Include OAuth1 authentication" OFF) -if (o2_WITH_TWITTER) - set(HAVE_TWITTER_SUPPORT 1) -endif() if (o2_WITH_DROPBOX) set(HAVE_DROPBOX_SUPPORT 1) endif() @@ -96,7 +92,7 @@ if(o2_WITH_KEYCHAIN) endif() endif(o2_WITH_KEYCHAIN) -if(o2_WITH_TWITTER OR o2_WITH_DROPBOX OR o2_WITH_FLICKR OR o2_WITH_SMUGMUG) +if(o2_WITH_DROPBOX OR o2_WITH_FLICKR OR o2_WITH_SMUGMUG) set(o2_WITH_OAUTH1 ON) endif() diff --git a/README.md b/README.md index 15fec3a..86b08a1 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,6 @@ O1Flickr | o1flickr.h | Flickr OAuth specialization O1Freshbooks | o1freshbooks.h | Freshbooks OAuth specialization O1Requestor | o1requestor.h | Makes authenticated OAuth 1.0 requests: GET, POST or PUT, handles timeouts O1RequestParameter | o1.h | An extra request parameter participating in request signing -O1Twitter | o1twitter.h | Twitter OAuth specialization O1SmugMug | o1smugmug.h | SmugMug OAuth specialization O2 | o2.h | Generic OAuth 2.0 authenticator O2Facebook | o2facebook.h | Facebook OAuth specialization @@ -43,7 +42,6 @@ O2ReplyServer | o2replyserver.h | HTTP server to process authentication response O2Requestor | o2requestor.h | Makes authenticated OAuth 2.0 requests (GET, POST or PUT), handles timeouts and token expiry O2Skydrive | o2skydrive.h | OneDrive OAuth specialization O2SurveyMonkey | o2surveymonkey.h | SurveyMonkey OAuth specialization -OXTwitter | oxtwitter.h | Twitter XAuth specialization O2Uber | o2uber.h | Uber OAuth specialization ## Installation @@ -256,8 +254,6 @@ The *examples* folder contains complete example applications: Name | Description :-- | :-- facebookdemo | Command line application authenticating with Facebook -sialis | QT Quick Twitter client using OAuth 1 -twitterdemo | Command line client for authenticating with Twitter and posting status updates. Uses OAuth 1 or Twitter XAuth ## Change Log diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6a33548..62bd686 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -8,10 +8,6 @@ if(o2_WITH_GOOGLE) add_subdirectory(youtubedemo) endif(o2_WITH_GOOGLE) -if(o2_WITH_TWITTER) - add_subdirectory(twitterdemo) -endif(o2_WITH_TWITTER) - #if(o2_WITH_SPOTIFY) # add_subdirectory(spotifydemo) #endif(o2_WITH_SPOTIFY) diff --git a/examples/sialis/.gitignore b/examples/sialis/.gitignore deleted file mode 100644 index fab7372..0000000 --- a/examples/sialis/.gitignore +++ /dev/null @@ -1,73 +0,0 @@ -# This file is used to ignore files which are generated -# ---------------------------------------------------------------------------- - -*~ -*.autosave -*.a -*.core -*.moc -*.o -*.obj -*.orig -*.rej -*.so -*.so.* -*_pch.h.cpp -*_resource.rc -*.qm -.#* -*.*# -core -!core/ -tags -.DS_Store -.directory -*.debug -Makefile* -*.prl -*.app -moc_*.cpp -ui_*.h -qrc_*.cpp -Thumbs.db -*.res -*.rc -/.qmake.cache -/.qmake.stash - -# qtcreator generated files -*.pro.user* - -# xemacs temporary files -*.flc - -# Vim temporary files -.*.swp - -# Visual Studio generated files -*.ib_pdb_index -*.idb -*.ilk -*.pdb -*.sln -*.suo -*.vcproj -*vcproj.*.*.user -*.ncb -*.sdf -*.opensdf -*.vcxproj -*vcxproj.* - -# MinGW generated files -*.Debug -*.Release - -# Python byte code -*.pyc - -# Binaries -# -------- -*.dll -*.exe - diff --git a/examples/sialis/README.md b/examples/sialis/README.md deleted file mode 100644 index cb8dad3..0000000 --- a/examples/sialis/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Sialis - -GUI demo for O2, demonstrating using O2 from QML, authenticating with Twitter and sending signed requests in order to show some tweets. - -To try out Sialis: - -1. Login to developer.twitter.com with your Twitter credentials -1. Create a new application "Sialis", record its API Key and API Secret - * Enable OAuth 1.0a authentication - * Set the callback URI to _http://127.0.0.1:8888/_ -1. In _main.qml_, change the O1Twitter object's _clientId_ property to the application's API Key -1. Change the _clientSecret_ property to the application's API secret -1. Build and run, press the _Login_ button to log in to Twitter and show the latest tweets diff --git a/examples/sialis/deployment.pri b/examples/sialis/deployment.pri deleted file mode 100644 index 265ce71..0000000 --- a/examples/sialis/deployment.pri +++ /dev/null @@ -1,13 +0,0 @@ -unix:!android { - isEmpty(target.path) { - qnx { - target.path = /tmp/$${TARGET}/bin - } else { - target.path = /opt/$${TARGET}/bin - } - export(target.path) - } - INSTALLS += target -} - -export(INSTALLS) diff --git a/examples/sialis/main.cpp b/examples/sialis/main.cpp deleted file mode 100644 index a9e1e98..0000000 --- a/examples/sialis/main.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include -#include - -#include "o1.h" -#include "o1twitter.h" -#include "o1requestor.h" -#include "twitterapi.h" - -int main(int argc, char *argv[]) { - QGuiApplication app(argc, argv); - QCoreApplication::setOrganizationName("MySoft"); - QCoreApplication::setOrganizationDomain("mysoft.com"); - QCoreApplication::setApplicationName("sialis"); - QtWebView::initialize(); - qmlRegisterType("com.pipacs.o2", 1, 0, "O1Twitter"); - qmlRegisterType("com.pipacs.o2", 1, 0, "TwitterApi"); - QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - return app.exec(); -} diff --git a/examples/sialis/main.qml b/examples/sialis/main.qml deleted file mode 100644 index 972ff4b..0000000 --- a/examples/sialis/main.qml +++ /dev/null @@ -1,129 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtWebView -import com.pipacs.o2 - -ApplicationWindow { - id: app - visible: true - title: "Sialis" - minimumWidth: 300 - minimumHeight: 200 - height: 700 - - O1Twitter { - id: o1Twitter - clientId: "The app's API Key from developer.twitter.com" - clientSecret: "The app's API Secret from developer.twitter.com " - localPort: 8888 - - onOpenBrowser: { - browser.url = url - browser.visible = true - } - - onCloseBrowser: { - browser.visible = false - } - - onLinkedChanged: { - loginButton.enabled = true - twitterApi.requestTweets() - } - } - - TwitterApi { - id: twitterApi - authenticator: o1Twitter - } - - footer: ToolBar { - Label { - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - text: o1Twitter.linked? ("Logged in as " + o1Twitter.extraTokens["screen_name"]): "Not logged in" - } - - Button { - id: loginButton - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - text: o1Twitter.linked? "Logout": "Login" - onClicked: { - enabled = false - if (o1Twitter.linked) { - o1Twitter.unlink() - } else { - o1Twitter.link() - } - } - } - - height: loginButton.height + 5 - } - - ListView { - id: listView - anchors.fill: parent - model: twitterApi.tweetModel - delegate: listDelegate - highlight: Rectangle {color: "#10000000"} - focus: true - - Component { - id: listDelegate - Item { - width: parent.width - height: label.contentHeight + 10 - Row { - anchors.fill: parent - Label { - id: label - anchors.centerIn: parent - width: parent.width - text: rawText - wrapMode: Text.Wrap - } - Rectangle { - width: parent.width - height: 1 - color: "#10000000" - border.color: "transparent" - } - } - MouseArea { - anchors.fill: parent - onClicked: listView.currentIndex = index - } - } - } - } - - ApplicationWindow { - id: browser - visible: false - minimumHeight: 800 - minimumWidth: 500 - title: "Login" - - property url url: "" - - WebView { - anchors.fill: parent - url: browser.url - } - - onClosing: { - close.accepted = true - loginButton.enabled = true - } - } - - Timer { - interval: 30000 - repeat: true - running: true - triggeredOnStart: true - onTriggered: twitterApi.requestTweets() - } -} diff --git a/examples/sialis/qml.qrc b/examples/sialis/qml.qrc deleted file mode 100644 index 5f6483a..0000000 --- a/examples/sialis/qml.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - main.qml - - diff --git a/examples/sialis/sialis.icns b/examples/sialis/sialis.icns deleted file mode 100644 index 907e93fabd95d669d4ed445d5b2c786dca9bfe92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32370 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 - -#include "tweetmodel.h" - -TweetModel::TweetModel(QObject *parent): QAbstractListModel(parent) { -} - -QHash TweetModel::roleNames() const { - QHash roles; - roles[RoleText] = "rawText"; - return roles; -} - -void TweetModel::addTweet(QVariantMap tweet) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - tweets.append(tweet); - endInsertRows(); -} - -void TweetModel::clearTweets() { - beginRemoveRows(QModelIndex(), 0, rowCount() - 1); - tweets.clear(); - endRemoveRows(); -} - -int TweetModel::rowCount(const QModelIndex &) const { - return tweets.count(); -} - -QVariant TweetModel::data(const QModelIndex &index, int role) const { - QVariant result; - QVariantMap tweet = tweets[index.row()]; - switch (role) { - case TweetModel::RoleText: - result = tweet["text"]; - default: - result = tweet["text"]; - } - return result; -} diff --git a/examples/sialis/tweetmodel.h b/examples/sialis/tweetmodel.h deleted file mode 100644 index 8ccbc81..0000000 --- a/examples/sialis/tweetmodel.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef TWEETMODEL_H -#define TWEETMODEL_H - -#include -#include -#include - -/// List of tweets, suitable as a ListView model -class TweetModel : public QAbstractListModel { - Q_OBJECT - -public: - enum Roles { - RoleText = Qt::UserRole + 1, - }; - - TweetModel(QObject *parent = nullptr); - - /// Clear all tweets - void clearTweets(); - - /// Add a tweet - void addTweet(QVariantMap tweet); - - /// Get number of tweets - int rowCount(const QModelIndex &parent = QModelIndex()) const; - - /// Access a tweet - QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - - /// Get role names - QHashroleNames() const; - -protected: - QList tweets; -}; - -#endif // TWEETMODEL_H diff --git a/examples/sialis/twitterapi.cpp b/examples/sialis/twitterapi.cpp deleted file mode 100644 index 864b49f..0000000 --- a/examples/sialis/twitterapi.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include - -#include "o1requestor.h" - -#include "twitterapi.h" - -TwitterApi::TwitterApi(QObject *parent): QObject(parent), authenticator_(0) { - manager_ = new QNetworkAccessManager(this); - tweetModel_ = new TweetModel(this); -} - -TwitterApi::~TwitterApi() { -} - -TweetModel *TwitterApi::tweetModel() { - return tweetModel_; -} - -O1Twitter *TwitterApi::authenticator() const { - return authenticator_; -} -void TwitterApi::setAuthenticator(O1Twitter *v) { - authenticator_ = v; - Q_EMIT authenticatorChanged(); -} - -void TwitterApi::requestTweets() { - if (!authenticator_ || !authenticator_->linked()) { - tweetModel_->clearTweets(); - emit tweetModelChanged(); - return; - } - O1Requestor *requestor = new O1Requestor(manager_, authenticator_, this); - QUrl url = QUrl("https://api.twitter.com/1.1/statuses/home_timeline.json"); - QNetworkRequest request(url); - QNetworkReply *reply = requestor->get(request, QList()); - connect(reply, &QNetworkReply::finished, this, &TwitterApi::tweetsReceived); - connect(reply, &QNetworkReply::errorOccurred, this, &TwitterApi::requestFailed); -} - -void TwitterApi::tweetsReceived() { - QNetworkReply *reply = qobject_cast(sender()); - QJsonDocument jsonResponse = QJsonDocument::fromJson(reply->readAll()); - tweetModel_->clearTweets(); - QJsonArray jsonArray = jsonResponse.array(); - foreach (const QJsonValue &v, jsonArray) { - QVariantMap item = v.toObject().toVariantMap(); - tweetModel_->addTweet(item); - } - emit tweetModelChanged(); -} - -void TwitterApi::requestFailed(QNetworkReply::NetworkError error) { - QNetworkReply *reply = qobject_cast(sender()); - qWarning() << "TwitterApi::requestFailed:" << (int)error << reply->errorString() << reply->readAll(); -} diff --git a/examples/sialis/twitterapi.h b/examples/sialis/twitterapi.h deleted file mode 100644 index 3353540..0000000 --- a/examples/sialis/twitterapi.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef TWITTERAPI_H -#define TWITTERAPI_H - -#include -#include -#include - -#include "o1twitter.h" - -#include "tweetmodel.h" - -/// Mini Twitter API -class TwitterApi: public QObject { - Q_OBJECT - -public: - /// List of tweets - Q_PROPERTY(TweetModel *tweetModel READ tweetModel NOTIFY tweetModelChanged) - TweetModel *tweetModel() ; - - /// OAuth authenticator - Q_PROPERTY(O1Twitter *authenticator READ authenticator WRITE setAuthenticator NOTIFY authenticatorChanged) - O1Twitter *authenticator() const; - void setAuthenticator(O1Twitter *v) ; - - explicit TwitterApi(QObject *parent = nullptr); - virtual ~TwitterApi(); - -public slots: - Q_INVOKABLE virtual void requestTweets(); - -signals: - void tweetModelChanged(); - void authenticatorChanged(); - -protected: - O1Twitter *authenticator_; - TweetModel *tweetModel_; - QNetworkAccessManager *manager_; - -protected slots: - void tweetsReceived(); - void requestFailed(QNetworkReply::NetworkError error); -}; - -#endif // TWITTERAPI_H diff --git a/examples/twitterdemo/CMakeLists.txt b/examples/twitterdemo/CMakeLists.txt deleted file mode 100644 index 7eb2d95..0000000 --- a/examples/twitterdemo/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 3.10.0) - -project( twitterexample ) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") - -if(o2_WITH_QT6) - find_package(Qt6 COMPONENTS Core Widgets Network REQUIRED) -else() - find_package(Qt5 COMPONENTS Core Widgets Script Network REQUIRED) -endif() - -include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} "../../src" ) - -set(fb_SRCS - main.cpp - tweeter.cpp -) - -add_executable( twitterexample ${fb_SRCS} ) - -target_link_libraries( twitterexample Qt::Core Qt::Widgets Qt::Network ) -target_link_libraries( twitterexample o2 ) diff --git a/examples/twitterdemo/main.cpp b/examples/twitterdemo/main.cpp deleted file mode 100644 index fbd1b2b..0000000 --- a/examples/twitterdemo/main.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include - -#include "tweeter.h" - -const char OPT_OAUTH[] = "-o"; -const char OPT_XAUTH[] = "-x"; -const char OPT_USERNAME[] = "-u"; -const char OPT_PASSWORD[] = "-p"; -const char OPT_STATUS[] = "-m"; - -const char USAGE[] = "\n" - "Usage: tweetdemo [OPTION]...\n" - "Get OAuth access tokens from Twitter's OAuth service and " - "(optionally) post a status update on a user's timeline\n" - "\nOptions:\n" - " %1\t\tLink with Twitter OAuth service, i.e get access tokens\n" - " %2\t\tLink with Twitter XAuth service, i.e get access tokens using the XAuth protocol\n" - " %3 \tTwitter username to be used while using XAuth (-x option)\n" - " %4 \tTwitter password to be used while using XAuth (-x option)\n" - " %5\t\tStatus update message, enclosed in double quotes\n"; - - -class Helper : public QObject { - Q_OBJECT - -public: - Helper() : QObject(), tweeter_(this) {} - -public slots: - void processArgs() { - QStringList argList = qApp->arguments(); - QByteArray help = QString(USAGE).arg(OPT_OAUTH, - OPT_XAUTH, - OPT_USERNAME, - OPT_PASSWORD, - OPT_STATUS).toLatin1(); - const char *helpText = help.constData(); - connect(&tweeter_, &Tweeter::linkingFailed, this, &Helper::onLinkingFailed); - connect(&tweeter_, &Tweeter::linkingSucceeded, this, &Helper::onLinkingSucceeded); - - if (argList.contains(OPT_OAUTH)) { - if (argList.contains(OPT_STATUS)) { - waitForMsg_ = true; - msg_ = argList.at(argList.indexOf(OPT_STATUS) + 1); - } - // Start OAuth - tweeter_.doOAuth(); - } else if (argList.contains(OPT_XAUTH)) { - if (!(argList.contains(OPT_USERNAME) && argList.contains(OPT_PASSWORD))) { - qDebug() << "\nError: Username or Password missing!"; - qDebug() << helpText; - qApp->exit(1); - } - - QString username = argList.at(argList.indexOf(OPT_USERNAME) + 1); - QString password = argList.at(argList.indexOf(OPT_PASSWORD) + 1); - - if (argList.contains(OPT_STATUS)) { - waitForMsg_ = true; - msg_ = argList.at(argList.indexOf(OPT_STATUS) + 1); - } - // Start XAuth - tweeter_.doXAuth(username, password); - } else if (argList.contains(OPT_STATUS)) { - QString statusMessage = argList.at(argList.indexOf(OPT_STATUS) + 1); - postStatusUpdate(statusMessage); - } else { - qDebug() << helpText; - qApp->exit(1); - } - } - - void onLinkingFailed() { - qDebug() << "Linking failed!"; - qApp->exit(1); - } - - void onLinkingSucceeded() { - qDebug() << "Linking succeeded!"; - if (waitForMsg_) { - postStatusUpdate(msg_); - } else { - qApp->quit(); - } - } - -private slots: - void postStatusUpdate(const QString& msg) { - connect(&tweeter_, &Tweeter::statusPosted, qApp, &QApplication::quit); - tweeter_.postStatusUpdate(msg); - } - -private: - Tweeter tweeter_; - bool waitForMsg_{false}; - QString msg_; -}; - -int main(int argc, char *argv[]) { - QApplication a(argc, argv); - QCoreApplication::setOrganizationName("MySoft"); - QCoreApplication::setOrganizationDomain("mysoft.com"); - QCoreApplication::setApplicationName("tweeter"); - Helper helper; -// Suppress warning: Potential leak of memory in qtimer.h [clang-analyzer-cplusplus.NewDeleteLeaks] -#ifndef __clang_analyzer__ - QTimer::singleShot(0, &helper, &Helper::processArgs); -#endif - return a.exec(); -} - -#include "main.moc" diff --git a/examples/twitterdemo/tweeter.cpp b/examples/twitterdemo/tweeter.cpp deleted file mode 100644 index ed2d338..0000000 --- a/examples/twitterdemo/tweeter.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#include - -#include "tweeter.h" -#include "o0globals.h" -#include "o1requestor.h" -#include "o0settingsstore.h" - -const char O2_CONSUMER_KEY[] = "2vHeyIxjywIadjEhvbDpg"; -const char O2_CONSUMER_SECRET[] = "Xfwe195Kp3ZpcCKgkYs7RKfugTm8EfpLkQvsKfX2vvs"; - -const int localPort = 8888; - -Tweeter::Tweeter(QObject *parent) : - QObject(parent) { -} - -void Tweeter::doOAuth() { - o1Twitter_ = new O1Twitter(this); - o1Twitter_->setClientId(O2_CONSUMER_KEY); - o1Twitter_->setClientSecret(O2_CONSUMER_SECRET); - o1Twitter_->setLocalPort(localPort); - - // Create a store object for writing the received tokens - O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY); - store->setGroupKey("twitter"); - o1Twitter_->setStore(store); - - // Connect signals - connect(o1Twitter_, &O0BaseAuth::linkedChanged, this, &Tweeter::onLinkedChanged); - connect(o1Twitter_, &O0BaseAuth::linkingFailed, this, &Tweeter::linkingFailed); - connect(o1Twitter_, &O0BaseAuth::linkingSucceeded, this, &Tweeter::onLinkingSucceeded); - connect(o1Twitter_, &O0BaseAuth::openBrowser, this, &Tweeter::onOpenBrowser); - connect(o1Twitter_, &O0BaseAuth::closeBrowser, this, &Tweeter::onCloseBrowser); - - qDebug() << "Starting OAuth..."; - o1Twitter_->unlink(); // For the sake of this demo - o1Twitter_->link(); -} - -void Tweeter::doXAuth(const QString &username, const QString &password) { - oxTwitter_ = new OXTwitter(this); - oxTwitter_->setClientId(O2_CONSUMER_KEY); - oxTwitter_->setClientSecret(O2_CONSUMER_SECRET); - oxTwitter_->setLocalPort(localPort); - - oxTwitter_->setUsername(username); - oxTwitter_->setPassword(password); - - // Create a store object for writing the received tokens - O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY); - store->setGroupKey("twitter"); - oxTwitter_->setStore(store); - - connect(oxTwitter_, &O0BaseAuth::linkedChanged, this, &Tweeter::onLinkedChanged); - connect(oxTwitter_, &O0BaseAuth::linkingFailed, this, &Tweeter::linkingFailed); - connect(oxTwitter_, &O0BaseAuth::linkingSucceeded, this, &Tweeter::onLinkingSucceeded); - connect(oxTwitter_, &O0BaseAuth::openBrowser, this, &Tweeter::onOpenBrowser); - connect(oxTwitter_, &O0BaseAuth::closeBrowser, this, &Tweeter::onCloseBrowser); - - qDebug() << "Starting XAuth..."; - qDebug() << "Username:" << username << "Password:" << password; - oxTwitter_->unlink(); // For the sake of this demo - oxTwitter_->link(); -} - -void Tweeter::postStatusUpdate(const QString &message) { - if (!o1Twitter_->linked()) { - qWarning() << "Application is not linked to Twitter!"; - emit statusPosted(); - return; - } - - qDebug() << "Status update message:" << message.toLatin1().constData(); - - QNetworkAccessManager* manager = new QNetworkAccessManager(this); - O1Twitter* o1 = o1Twitter_; - O1Requestor* requestor = new O1Requestor(manager, o1, this); - - QByteArray paramName("status"); - - QList reqParams = QList(); - reqParams << O0RequestParameter(paramName, message.toLatin1()); - - QByteArray postData = O1::createQueryParameters(reqParams); - - QUrl url = QUrl("https://api.twitter.com/1.1/statuses/update.json"); - - QNetworkRequest request(url); - request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM); - - QNetworkReply *reply = requestor->post(request, reqParams, postData); - connect(reply, &QNetworkReply::finished, this, &Tweeter::tweetReplyDone); -} - -void Tweeter::onOpenBrowser(const QUrl &url) { - qDebug() << "Opening browser with URL" << url.toString(); - QDesktopServices::openUrl(url); -} - -void Tweeter::onCloseBrowser() { -} - -void Tweeter::onLinkedChanged() { - qDebug() << "Linked changed!"; -} - -void Tweeter::onLinkingSucceeded() { - O1Twitter *o1t = qobject_cast(sender()); - if (!o1t->linked()) { - return; - } - QVariantMap extraTokens = o1t->extraTokens(); - if (!extraTokens.isEmpty()) { - emit extraTokensReady(extraTokens); - qDebug() << "Extra tokens in response:"; - for (auto it = extraTokens.constBegin(); it != extraTokens.constEnd(); ++it) { - qDebug() << "\t" << it.key() << ":" << (it.value().toString().left(3) + "..."); - } - } - emit linkingSucceeded(); -} - -void Tweeter::tweetReplyDone() { - QNetworkReply *reply = qobject_cast(sender()); - if (reply->error() != QNetworkReply::NoError) { - qDebug() << "ERROR:" << reply->errorString(); - qDebug() << "Content:" << reply->readAll(); - } else { - qDebug() << "Tweet posted sucessfully!"; - } - emit statusPosted(); -} diff --git a/examples/twitterdemo/tweeter.h b/examples/twitterdemo/tweeter.h deleted file mode 100644 index a867eda..0000000 --- a/examples/twitterdemo/tweeter.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef TWEETER_H -#define TWEETER_H - -#include -#include -#include -#include - -#include "o1twitter.h" -#include "oxtwitter.h" - -class Tweeter : public QObject -{ - Q_OBJECT -public: - explicit Tweeter(QObject *parent = nullptr); - -signals: - void extraTokensReady(const QVariantMap &extraTokens); - void linkingFailed(); - void linkingSucceeded(); - void statusPosted(); - -public slots: - void doOAuth(); - void doXAuth(const QString &username, const QString &password); - void postStatusUpdate(const QString &message); - -private slots: - void onLinkedChanged(); - void onLinkingSucceeded(); - void onOpenBrowser(const QUrl &url); - void onCloseBrowser(); - void tweetReplyDone(); - -private: - O1Twitter* o1Twitter_{nullptr}; - OXTwitter* oxTwitter_{nullptr}; -}; - -#endif // TWEETER_H diff --git a/examples/twitterdemo/twitterdemo.pro b/examples/twitterdemo/twitterdemo.pro deleted file mode 100644 index b1bf512..0000000 --- a/examples/twitterdemo/twitterdemo.pro +++ /dev/null @@ -1,15 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -DEFINES += O0_EXPORT= -include(../../src/src.pri) - -TARGET = twitterdemo -TEMPLATE = app - -SOURCES += main.cpp \ - tweeter.cpp - -HEADERS += \ - tweeter.h diff --git a/o2-config.h.cmake b/o2-config.h.cmake index d073348..c1d10a3 100644 --- a/o2-config.h.cmake +++ b/o2-config.h.cmake @@ -2,7 +2,6 @@ #define O2_CONFIG_SUPPORT_FEATURE_H -#cmakedefine01 HAVE_TWITTER_SUPPORT #cmakedefine01 HAVE_DROPBOX_SUPPORT #cmakedefine01 HAVE_GOOGLE_SUPPORT #cmakedefine01 HAVE_UBER_SUPPORT diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7f144bc..44e9aa8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -54,18 +54,6 @@ if(o2_WITH_OAUTH1) ) endif(o2_WITH_OAUTH1) -if(o2_WITH_TWITTER) - set( o2_SRCS - ${o2_SRCS} - oxtwitter.cpp - ) - set( o2_HDRS - ${o2_HDRS} - o1twitter.h - oxtwitter.h - ) -endif(o2_WITH_TWITTER) - if(o2_WITH_DROPBOX) set( o2_HDRS ${o2_HDRS} diff --git a/src/o1twitter.h b/src/o1twitter.h deleted file mode 100644 index c229ac7..0000000 --- a/src/o1twitter.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef O1TWITTER_H -#define O1TWITTER_H - -#include "o0export.h" -#include "o1.h" - -/// Twitter OAuth 1.0 client -class O0_EXPORT O1Twitter: public O1 { - Q_OBJECT - -public: - explicit O1Twitter(QObject *parent = nullptr): O1(parent) { - setRequestTokenUrl(QUrl("https://api.twitter.com/oauth/request_token")); - setAuthorizeUrl(QUrl("https://api.twitter.com/oauth/authenticate")); - setAccessTokenUrl(QUrl("https://api.twitter.com/oauth/access_token")); - } -}; - -#endif // O1TWITTER_H diff --git a/src/oxtwitter.cpp b/src/oxtwitter.cpp deleted file mode 100644 index f67533b..0000000 --- a/src/oxtwitter.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include - -#include "oxtwitter.h" -#include "o0globals.h" - -const char XAUTH_USERNAME[] = "x_auth_username"; -const char XAUTH_PASSWORD[] = "x_auth_password"; -const char XAUTH_MODE[] = "x_auth_mode"; -const char XAUTH_MODE_VALUE[] = "client_auth"; - -OXTwitter::OXTwitter(QObject *parent): O1Twitter(parent) { -} - -QString OXTwitter::username() { - return username_; -} - -void OXTwitter::setUsername(const QString &username) { - username_ = username; - Q_EMIT usernameChanged(); -} - -QString OXTwitter::password() { - return password_; -} - -void OXTwitter::setPassword(const QString &password) { - password_ = password; - Q_EMIT passwordChanged(); -} - -void OXTwitter::link() { - qDebug() << "OXTwitter::link"; - if (linked()) { - qDebug() << "Linked already"; - return; - } - - if (username_.isEmpty() || password_.isEmpty()) { - qWarning() << "Error: XAuth parameters not set. Aborting!"; - return; - } - - // prepare XAuth parameters - xAuthParams_.append(O0RequestParameter(QByteArray(XAUTH_USERNAME), username_.toLatin1())); - xAuthParams_.append(O0RequestParameter(QByteArray(XAUTH_PASSWORD), password_.toLatin1())); - xAuthParams_.append(O0RequestParameter(QByteArray(XAUTH_MODE), QByteArray(XAUTH_MODE_VALUE))); - - QList oauthParams; - oauthParams.append(O0RequestParameter(O2_OAUTH_SIGNATURE_METHOD, O2_SIGNATURE_TYPE_HMAC_SHA1)); - oauthParams.append(O0RequestParameter(O2_OAUTH_CONSUMER_KEY, clientId().toLatin1())); - oauthParams.append(O0RequestParameter(O2_OAUTH_VERSION, "1.0")); -#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - oauthParams.append(O0RequestParameter(O2_OAUTH_TIMESTAMP, QString::number(QDateTime::currentSecsSinceEpoch()).toLatin1())); -#else - oauthParams.append(O0RequestParameter(O2_OAUTH_TIMESTAMP, QString::number(QDateTime::currentDateTimeUtc().toTime_t()).toLatin1())); -#endif - oauthParams.append(O0RequestParameter(O2_OAUTH_NONCE, nonce())); - oauthParams.append(O0RequestParameter(O2_OAUTH_TOKEN, QByteArray(""))); - oauthParams.append(O0RequestParameter(O2_OAUTH_VERFIER, QByteArray(""))); - - QByteArray signature = sign(oauthParams, xAuthParams_, accessTokenUrl(), QNetworkAccessManager::PostOperation, clientSecret(), ""); - oauthParams.append(O0RequestParameter(O2_OAUTH_SIGNATURE, signature)); - - // Post request - QNetworkRequest request(accessTokenUrl()); - decorateRequest(request, oauthParams); - request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM); - QNetworkReply *reply = manager_->post(request, createQueryParameters(xAuthParams_)); -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onTokenExchangeError(QNetworkReply::NetworkError))); -#else - connect(reply, &QNetworkReply::errorOccurred, this, &OXTwitter::onTokenExchangeError); -#endif - connect(reply, &QNetworkReply::finished, this, &OXTwitter::onTokenExchangeFinished); -} diff --git a/src/oxtwitter.h b/src/oxtwitter.h deleted file mode 100644 index a1353af..0000000 --- a/src/oxtwitter.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef OXTWITTER_H -#define OXTWITTER_H - -#include "o0export.h" -#include "o1twitter.h" - -/// Twitter authenticator using Twitter XAuth -class O0_EXPORT OXTwitter: public O1Twitter { - Q_OBJECT - -public: - explicit OXTwitter(QObject *parent = nullptr); - - /// XAuth Username - Q_PROPERTY(QString username READ username WRITE setUsername NOTIFY usernameChanged) - QString username(); - void setUsername(const QString &username); - - /// XAuth Password - Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) - QString password(); - void setPassword(const QString &password); - -public Q_SLOTS: - /// Authenticate. - Q_INVOKABLE void link() override; - -Q_SIGNALS: - void usernameChanged(); - void passwordChanged(); - -private: - QList xAuthParams_; - QString username_; - QString password_; -}; - -#endif // OXTWITTER_H diff --git a/src/src.pri b/src/src.pri index 10be410..a4507af 100644 --- a/src/src.pri +++ b/src/src.pri @@ -18,7 +18,6 @@ SOURCES += \ $$PWD/o2replyserver.cpp \ $$PWD/o2requestor.cpp \ $$PWD/o2skydrive.cpp \ - $$PWD/oxtwitter.cpp \ $$PWD/o2simplecrypt.cpp \ $$PWD/o0baseauth.cpp \ $$PWD/o0settingsstore.cpp \ @@ -36,7 +35,6 @@ HEADERS += \ $$PWD/o1flickr.h \ $$PWD/o1requestor.h \ $$PWD/o1smugmug.h \ - $$PWD/o1twitter.h \ $$PWD/o1timedreply.h \ $$PWD/o1upwork.h \ $$PWD/o2.h \ @@ -48,7 +46,6 @@ HEADERS += \ $$PWD/o2replyserver.h \ $$PWD/o2requestor.h \ $$PWD/o2skydrive.h \ - $$PWD/oxtwitter.h \ $$PWD/o1freshbooks.h \ $$PWD/o0baseauth.h \ $$PWD/o0globals.h \ @@ -69,7 +66,6 @@ headers.files += \ $$PWD/o1flickr.h \ $$PWD/o1requestor.h \ $$PWD/o1smugmug.h \ - $$PWD/o1twitter.h \ $$PWD/o1timedreply.h \ $$PWD/o1upwork.h \ $$PWD/o2.h \ @@ -80,7 +76,6 @@ headers.files += \ $$PWD/o2replyserver.h \ $$PWD/o2requestor.h \ $$PWD/o2skydrive.h \ - $$PWD/oxtwitter.h \ $$PWD/o1freshbooks.h \ $$PWD/o0baseauth.h \ $$PWD/o0globals.h \