File indexing completed on 2024-05-19 12:37:33
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"