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"