File indexing completed on 2024-04-28 04:55:36

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2008-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "twitterapiaccount.h"
0010 
0011 #include <KIO/AccessManager>
0012 
0013 #include "passwordmanager.h"
0014 
0015 #include "twitterapidebug.h"
0016 #include "twitterapimicroblog.h"
0017 #include "twitterapioauth.h"
0018 
0019 class TwitterApiAccount::Private
0020 {
0021 public:
0022     Private()
0023         : api(QLatin1Char('/')), usingOauth(true), qoauth(nullptr)
0024     {}
0025     QString userId;
0026     int count;
0027     QString host;
0028     QString api;
0029     QUrl apiUrl;
0030     QUrl homepageUrl;
0031     QStringList friendsList;
0032     QStringList followersList;
0033     QStringList timelineNames;
0034     QByteArray oauthToken;
0035     QByteArray oauthTokenSecret;
0036     QByteArray oauthConsumerKey;
0037     QByteArray oauthConsumerSecret;
0038     bool usingOauth;
0039     TwitterApiOAuth *qoauth;
0040 };
0041 
0042 TwitterApiAccount::TwitterApiAccount(TwitterApiMicroBlog *parent, const QString &alias)
0043     : Account(parent, alias), d(new Private)
0044 {
0045     qCDebug(CHOQOK);
0046     d->usingOauth = configGroup()->readEntry("UsingOAuth", false);
0047     d->userId = configGroup()->readEntry("UserId", QString());
0048     d->count = configGroup()->readEntry("CountOfPosts", 20);
0049     d->host = configGroup()->readEntry("Host", QString());
0050     d->friendsList = configGroup()->readEntry("Friends", QStringList());
0051     d->followersList = configGroup()->readEntry("Followers", QStringList());
0052     d->timelineNames = configGroup()->readEntry("Timelines", QStringList());
0053     d->oauthToken = configGroup()->readEntry("OAuthToken", QByteArray());
0054     d->oauthConsumerKey = configGroup()->readEntry("OAuthConsumerKey", QByteArray());
0055     d->oauthConsumerSecret = Choqok::PasswordManager::self()->readPassword(
0056                                  QStringLiteral("%1_consumerSecret").arg(alias)).toUtf8();
0057     d->oauthTokenSecret = Choqok::PasswordManager::self()->readPassword(
0058                               QStringLiteral("%1_tokenSecret").arg(alias)).toUtf8();
0059     setApi(configGroup()->readEntry(QLatin1String("Api"), QString::fromLatin1("/")));
0060 
0061     qCDebug(CHOQOK) << "UsingOAuth:" << d->usingOauth;
0062     if (d->usingOauth) {
0063         initQOAuthInterface();
0064     }
0065 
0066     if (d->timelineNames.isEmpty()) {
0067         QStringList list = parent->timelineNames();
0068         list.removeOne(QLatin1String("Public"));
0069         list.removeOne(QLatin1String("Favorite"));
0070         list.removeOne(QLatin1String("ReTweets"));
0071         d->timelineNames = list;
0072     }
0073 
0074     if (d->friendsList.isEmpty()) {
0075         parent->listFriendsUsername(this);
0076         //Result will set on TwitterApiMicroBlog!
0077     }
0078 }
0079 
0080 TwitterApiAccount::~TwitterApiAccount()
0081 {
0082     if(d->qoauth)
0083         d->qoauth->deleteLater();
0084     delete d;
0085 }
0086 
0087 void TwitterApiAccount::writeConfig()
0088 {
0089     configGroup()->writeEntry("UsingOAuth", d->usingOauth);
0090     configGroup()->writeEntry("UserId", d->userId);
0091     configGroup()->writeEntry("CountOfPosts", d->count);
0092     configGroup()->writeEntry("Host", d->host);
0093     configGroup()->writeEntry("Api", d->api);
0094     configGroup()->writeEntry("Friends", d->friendsList);
0095     configGroup()->writeEntry("Followers", d->followersList);
0096     configGroup()->writeEntry("Timelines", d->timelineNames);
0097     configGroup()->writeEntry("OAuthToken", d->oauthToken);
0098     configGroup()->writeEntry("OAuthConsumerKey", d->oauthConsumerKey);
0099     Choqok::PasswordManager::self()->writePassword(QStringLiteral("%1_consumerSecret").arg(alias()),
0100             QString::fromUtf8(d->oauthConsumerSecret));
0101     Choqok::PasswordManager::self()->writePassword(QStringLiteral("%1_tokenSecret").arg(alias()),
0102             QString::fromUtf8(d->oauthTokenSecret));
0103     Choqok::Account::writeConfig();
0104 }
0105 
0106 QString TwitterApiAccount::userId() const
0107 {
0108     return d->userId;
0109 }
0110 
0111 void TwitterApiAccount::setUserId(const QString &id)
0112 {
0113     d->userId = id;
0114 }
0115 
0116 int TwitterApiAccount::countOfPosts() const
0117 {
0118     return d->count;
0119 }
0120 
0121 void TwitterApiAccount::setCountOfPosts(int count)
0122 {
0123     d->count = count;
0124 }
0125 
0126 QUrl TwitterApiAccount::apiUrl() const
0127 {
0128     return d->apiUrl;
0129 }
0130 
0131 QString TwitterApiAccount::host() const
0132 {
0133     return d->host;
0134 }
0135 
0136 void TwitterApiAccount::setApiUrl(const QUrl &apiUrl)
0137 {
0138     d->apiUrl = apiUrl;
0139 }
0140 
0141 QString TwitterApiAccount::api() const
0142 {
0143     return d->api;
0144 }
0145 
0146 void TwitterApiAccount::setApi(const QString &api)
0147 {
0148     d->api = api;
0149     generateApiUrl();
0150 }
0151 
0152 void TwitterApiAccount::setHost(const QString &host)
0153 {
0154     d->host = host;
0155     generateApiUrl();
0156 }
0157 
0158 QUrl TwitterApiAccount::homepageUrl() const
0159 {
0160     return d->homepageUrl;
0161 }
0162 
0163 void TwitterApiAccount::generateApiUrl()
0164 {
0165     if (!host().startsWith(QLatin1String("http"))) { //NOTE: This is for compatibility by prev versions. remove it after 1.0 release
0166         setHost(host().prepend(QLatin1String("http://")));
0167     }
0168     QUrl url(host());
0169 
0170     setHomepageUrl(url);
0171 
0172     url = url.adjusted(QUrl::StripTrailingSlash);
0173     url.setPath(url.path() + QLatin1Char('/') + (api()));
0174     setApiUrl(url);
0175 }
0176 
0177 void TwitterApiAccount::setHomepageUrl(const QUrl &homepageUrl)
0178 {
0179     d->homepageUrl = homepageUrl;
0180 }
0181 
0182 QStringList TwitterApiAccount::friendsList() const
0183 {
0184     return d->friendsList;
0185 }
0186 
0187 void TwitterApiAccount::setFriendsList(const QStringList &list)
0188 {
0189     d->friendsList = list;
0190     writeConfig();
0191 }
0192 
0193 QStringList TwitterApiAccount::followersList() const
0194 {
0195     return d->followersList;
0196 }
0197 
0198 void TwitterApiAccount::setFollowersList(const QStringList& list)
0199 {
0200     d->followersList = list;
0201     writeConfig();
0202 }
0203 
0204 QStringList TwitterApiAccount::timelineNames() const
0205 {
0206     return d->timelineNames;
0207 }
0208 
0209 void TwitterApiAccount::setTimelineNames(const QStringList &list)
0210 {
0211     d->timelineNames.clear();
0212     for (const QString &name: list) {
0213         if (microblog()->timelineNames().contains(name)) {
0214             d->timelineNames << name;
0215         }
0216     }
0217 }
0218 
0219 QByteArray TwitterApiAccount::oauthToken() const
0220 {
0221     return d->oauthToken;
0222 }
0223 
0224 void TwitterApiAccount::setOauthToken(const QByteArray &token)
0225 {
0226     d->oauthToken = token;
0227 }
0228 
0229 QByteArray TwitterApiAccount::oauthTokenSecret() const
0230 {
0231     return d->oauthTokenSecret;
0232 }
0233 
0234 void TwitterApiAccount::setOauthTokenSecret(const QByteArray &tokenSecret)
0235 {
0236     d->oauthTokenSecret = tokenSecret;
0237 }
0238 
0239 QByteArray TwitterApiAccount::oauthConsumerKey() const
0240 {
0241     return d->oauthConsumerKey;
0242 }
0243 
0244 void TwitterApiAccount::setOauthConsumerKey(const QByteArray &consumerKey)
0245 {
0246     d->oauthConsumerKey = consumerKey;
0247 }
0248 
0249 QByteArray TwitterApiAccount::oauthConsumerSecret() const
0250 {
0251     return d->oauthConsumerSecret;
0252 }
0253 
0254 void TwitterApiAccount::setOauthConsumerSecret(const QByteArray &consumerSecret)
0255 {
0256     d->oauthConsumerSecret = consumerSecret;
0257 }
0258 
0259 bool TwitterApiAccount::usingOAuth() const
0260 {
0261     return d->usingOauth;
0262 }
0263 
0264 void TwitterApiAccount::setUsingOAuth(bool use)
0265 {
0266     if (use) {
0267         initQOAuthInterface();
0268     } else {
0269         delete d->qoauth;
0270         d->qoauth = nullptr;
0271     }
0272     d->usingOauth = use;
0273 }
0274 
0275 TwitterApiOAuth *TwitterApiAccount::oauthInterface()
0276 {
0277     return d->qoauth;
0278 }
0279 
0280 void TwitterApiAccount::initQOAuthInterface()
0281 {
0282     qCDebug(CHOQOK);
0283     if (!d->qoauth) {
0284         d->qoauth = new TwitterApiOAuth(this);
0285     }
0286     d->qoauth->setToken(QLatin1String(d->oauthToken));
0287     d->qoauth->setTokenSecret(QLatin1String(d->oauthTokenSecret));
0288 }
0289 
0290 #include "moc_twitterapiaccount.cpp"