File indexing completed on 2024-05-12 04:57:44
0001 /* 0002 This file is part of Choqok, the KDE micro-blogging client 0003 0004 SPDX-FileCopyrightText: 2010-2012 Andrey Esin <gmlastik@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 "mobypicture.h" 0010 0011 #include <QDebug> 0012 #include <QJsonDocument> 0013 0014 #include <KIO/StoredTransferJob> 0015 #include <KPluginFactory> 0016 0017 #include "accountmanager.h" 0018 #include "mediamanager.h" 0019 #include "passwordmanager.h" 0020 0021 #include "twitterapiaccount.h" 0022 #include "twitterapimicroblog.h" 0023 0024 #include "mobypicturesettings.h" 0025 0026 K_PLUGIN_CLASS_WITH_JSON(Mobypicture, "choqok_mobypicture.json") 0027 0028 Mobypicture::Mobypicture(QObject *parent, const QList<QVariant> &) 0029 : Choqok::Uploader(QLatin1String("choqok_mobypicture"), parent) 0030 { 0031 } 0032 0033 Mobypicture::~Mobypicture() 0034 { 0035 } 0036 0037 void Mobypicture::upload(const QUrl &localUrl, const QByteArray &medium, const QByteArray &mediumType) 0038 { 0039 MobypictureSettings::self()->load(); 0040 KIO::StoredTransferJob *job = nullptr; 0041 QByteArray apiKey = "85LUKv3w6luUF6Pa"; 0042 if (MobypictureSettings::oauth()) { 0043 QString alias = MobypictureSettings::alias(); 0044 if (alias.isEmpty()) { 0045 qCritical() << "No account to use"; 0046 Q_EMIT uploadingFailed(localUrl, i18n("There is no Twitter account configured to use.")); 0047 return; 0048 } 0049 TwitterApiAccount *acc = qobject_cast<TwitterApiAccount *> (Choqok::AccountManager::self()->findAccount(alias)); 0050 if (!acc) { 0051 return; 0052 } 0053 0054 QUrl url(QLatin1String("https://api.mobypicture.com/2.0/upload")); 0055 0056 QMap<QString, QByteArray> formdata; 0057 formdata[QLatin1String("key")] = apiKey; 0058 formdata[QLatin1String("message")] = QString().toUtf8(); 0059 0060 QMap<QString, QByteArray> mediafile; 0061 mediafile[QLatin1String("name")] = "media"; 0062 mediafile[QLatin1String("filename")] = localUrl.fileName().toUtf8(); 0063 mediafile[QLatin1String("mediumType")] = mediumType; 0064 mediafile[QLatin1String("medium")] = medium; 0065 QList< QMap<QString, QByteArray> > listMediafiles; 0066 listMediafiles.append(mediafile); 0067 0068 QByteArray data = Choqok::MediaManager::createMultipartFormData(formdata, listMediafiles); 0069 0070 job = KIO::storedHttpPost(data, url, KIO::HideProgressInfo); 0071 QUrl requrl(QLatin1String("https://api.twitter.com/1/account/verify_credentials.json")); 0072 QByteArray credentials = acc->oauthInterface()->authorizationHeader(requrl, QNetworkAccessManager::GetOperation); 0073 0074 QString cHeader = QLatin1String("X-Verify-Credentials-Authorization: ") + QLatin1String(credentials) + QLatin1String("\r\n"); 0075 cHeader.append(QLatin1String("X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json")); 0076 job->addMetaData(QLatin1String("customHTTPHeader"), cHeader); 0077 } else if (MobypictureSettings::basic()) { 0078 QUrl url(QLatin1String("https://api.mobypicture.com")); 0079 QString login = MobypictureSettings::login(); 0080 QString pass = Choqok::PasswordManager::self()->readPassword(QStringLiteral("mobypicture_%1") 0081 .arg(MobypictureSettings::login())); 0082 QMap<QString, QByteArray> formdata; 0083 formdata[QLatin1String("k")] = apiKey; 0084 formdata[QLatin1String("u")] = login.toUtf8(); 0085 formdata[QLatin1String("p")] = pass.toUtf8(); 0086 formdata[QLatin1String("s")] = "none"; 0087 formdata[QLatin1String("format")] = "json"; 0088 0089 QMap<QString, QByteArray> mediafile; 0090 mediafile[QLatin1String("name")] = "i"; 0091 mediafile[QLatin1String("filename")] = localUrl.fileName().toUtf8(); 0092 mediafile[QLatin1String("mediumType")] = mediumType; 0093 mediafile[QLatin1String("medium")] = medium; 0094 QList< QMap<QString, QByteArray> > listMediafiles; 0095 listMediafiles.append(mediafile); 0096 QByteArray data = Choqok::MediaManager::createMultipartFormData(formdata, listMediafiles); 0097 0098 job = KIO::storedHttpPost(data, url, KIO::HideProgressInfo) ; 0099 job->addMetaData(QLatin1String("Authorization"), 0100 QLatin1String("Basic ") + QLatin1String(QStringLiteral("%1:%2").arg(login).arg(pass).toUtf8().toBase64())); 0101 } 0102 0103 if (!job) { 0104 qCritical() << "Cannot create a http POST request!"; 0105 return; 0106 } 0107 job->addMetaData(QLatin1String("content-type"), 0108 QLatin1String("Content-Type: multipart/form-data; boundary=AaB03x")); 0109 mUrlMap[job] = localUrl; 0110 connect(job, &KIO::StoredTransferJob::result, this, &Mobypicture::slotUpload); 0111 job->start(); 0112 } 0113 0114 void Mobypicture::slotUpload(KJob *job) 0115 { 0116 QUrl localUrl = mUrlMap.take(job); 0117 if (job->error()) { 0118 qCritical() << "Job Error:" << job->errorString(); 0119 Q_EMIT uploadingFailed(localUrl, job->errorString()); 0120 return; 0121 } else { 0122 KIO::StoredTransferJob *stj = qobject_cast<KIO::StoredTransferJob *>(job); 0123 //qDebug() << stj->data(); 0124 const QJsonDocument json = QJsonDocument::fromJson(stj->data()); 0125 if (!json.isNull()) { 0126 const QVariantMap map = json.toVariant().toMap(); 0127 if (MobypictureSettings::oauth()) { 0128 if (map.contains(QLatin1String("errors"))) { 0129 QVariantMap err = map.value(QLatin1String("errors")).toMap(); 0130 Q_EMIT uploadingFailed(localUrl, err.value(QLatin1String("message")).toString()); 0131 } else if (map.contains(QLatin1String("media"))) { 0132 QVariantMap media = map.value(QLatin1String("media")).toMap(); 0133 Q_EMIT mediumUploaded(localUrl, media.value(QLatin1String("mediaurl")).toString()); 0134 } 0135 } 0136 if (MobypictureSettings::basic()) { 0137 if (map.value(QLatin1String("result")) == QLatin1String("0") && map.contains(QLatin1String("url"))) { 0138 Q_EMIT mediumUploaded(localUrl, map.value(QLatin1String("url")).toString()); 0139 } else { 0140 Q_EMIT uploadingFailed(localUrl, map.value(QLatin1String("message")).toString()); 0141 } 0142 } 0143 } else { 0144 Q_EMIT uploadingFailed(localUrl, i18n("Malformed response")); 0145 qWarning() << "Parse error:" << stj->data(); 0146 } 0147 } 0148 } 0149 0150 #include "mobypicture.moc" 0151 #include "moc_mobypicture.cpp"