Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
15 KB
Referenced Files
None
Subscribers
None
diff --git a/tools/uploader/imguruploader.cpp b/tools/uploader/imguruploader.cpp
index 5c839ca..b19a431 100644
--- a/tools/uploader/imguruploader.cpp
+++ b/tools/uploader/imguruploader.cpp
@@ -1,202 +1,202 @@
#include "imguruploader.h"
#include "../uploader/uploader.h"
#include <QNetworkAccessManager>
#include <QtNetwork>
#include <QJsonDocument>
#include <QJsonObject>
ImgurUploader::ImgurUploader(QObject *parent) : ImageUploader(parent)
{
mUploaderType = "imgur";
loadSettings();
}
const QString ImgurUploader::clientId()
{
return QString("3ebe94c791445c1");
}
const QString ImgurUploader::clientSecret()
{
return QString("0546b05d6a80b2092dcea86c57b792c9c9faebf0");
}
void ImgurUploader::authorize(const QString &pin, AuthorizationCallback callback)
{
if (pin.isEmpty()) {
callback(false);
return;
}
QByteArray parameters;
parameters.append(QString("client_id=").toUtf8());
parameters.append(QUrl::toPercentEncoding(clientId()));
parameters.append(QString("&client_secret=").toUtf8());
parameters.append(QUrl::toPercentEncoding(clientSecret()));
parameters.append(QString("&grant_type=pin").toUtf8());
parameters.append(QString("&pin=").toUtf8());
parameters.append(QUrl::toPercentEncoding(pin));
QNetworkRequest request(QUrl("https://api.imgur.com/oauth2/token"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QNetworkReply *reply = Uploader::instance()->nam()->post(request, parameters);
authorizationReply(reply, callback);
}
void ImgurUploader::refreshAuthorization(const QString &refresh_token, AuthorizationCallback callback)
{
if (refresh_token.isEmpty()) {
callback(false);
return;
}
QByteArray parameters;
parameters.append(QString("refresh_token=").toUtf8());
parameters.append(QUrl::toPercentEncoding(refresh_token));
parameters.append(QString("&client_id=").toUtf8());
parameters.append(QUrl::toPercentEncoding(clientId()));
parameters.append(QString("&client_secret=").toUtf8());
parameters.append(QUrl::toPercentEncoding(clientSecret()));
parameters.append(QString("&grant_type=refresh_token").toUtf8());
QNetworkRequest request(QUrl("https://api.imgur.com/oauth2/token"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QNetworkReply *reply = Uploader::instance()->nam()->post(request, parameters);
authorizationReply(reply, callback);
}
void ImgurUploader::upload(const QString &fileName)
{
QFile *file = new QFile(fileName);
if (!file->open(QIODevice::ReadOnly)) {
emit error(ImageUploader::FileError, tr("Unable to read screenshot file"), fileName);
file->deleteLater();
return;
}
QNetworkRequest request(QUrl("https://api.imgur.com/3/image"));
request.setRawHeader("Authorization", QString("Client-ID %1").arg(clientId()).toLatin1());
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
if (!mSettings.value("anonymous", true).toBool()) {
request.setRawHeader("Authorization", QByteArray("Bearer ") + mSettings.value("access_token").toByteArray());
if (!mSettings.value("album").toString().isEmpty()) {
QHttpPart albumPart;
albumPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"album\""));
albumPart.setBody(mSettings.value("album").toByteArray());
multiPart->append(albumPart);
}
}
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QMimeDatabase().mimeTypeForFile(fileName, QMimeDatabase::MatchExtension).name());
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\""));
imagePart.setBodyDevice(file);
file->setParent(multiPart);
multiPart->append(imagePart);
QNetworkReply *reply = Uploader::instance()->nam()->post(request, multiPart);
reply->setProperty("fileName", fileName);
this->setProperty("fileName", fileName);
multiPart->setParent(reply);
connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));
connect(this , SIGNAL(cancelRequest()), reply, SLOT(abort()));
connect(this , SIGNAL(cancelRequest()), reply, SLOT(deleteLater()));
connect(reply, SIGNAL(finished()), this, SLOT(finished()));
}
void ImgurUploader::retry()
{
loadSettings();
upload(property("fileName").toString());
}
void ImgurUploader::cancel()
{
emit cancelRequest();
}
void ImgurUploader::finished()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
reply->deleteLater();
QString fileName = reply->property("fileName").toString();
if (reply->error() != QNetworkReply::NoError) {
if (reply->error() == QNetworkReply::OperationCanceledError) {
emit error(ImageUploader::CancelError, "", fileName);
} else if (reply->error() == QNetworkReply::ContentOperationNotPermittedError ||
reply->error() == QNetworkReply::AuthenticationRequiredError) {
refreshAuthorization(mSettings["refresh_token"].toString(), [&](bool result) {
if (result) {
QTimer::singleShot(50, this, &ImgurUploader::retry);
} else {
cancel();
emit error(ImageUploader::AuthorizationError, tr("Imgur user authentication failed"), fileName);
}
});
} else {
emit error(ImageUploader::NetworkError, reply->errorString(), fileName);
}
return;
}
if (reply->rawHeader("X-RateLimit-Remaining") == "0") {
emit error(ImageUploader::HostError, tr("Imgur upload limit reached"), fileName);
return;
}
QJsonObject imgurResponse = QJsonDocument::fromJson(reply->readAll()).object();
if (imgurResponse.value("success").toBool() == true && imgurResponse.value("status").toInt() == 200) {
QJsonObject imageData = imgurResponse.value("data").toObject();
emit uploaded(fileName, imageData["link"].toString(), imageData["deletehash"].toString());
} else {
emit error(ImageUploader::HostError, tr("Imgur error"), fileName);
}
}
void ImgurUploader::uploadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
float b = (float) bytesReceived / bytesTotal;
int p = qRound(b * 100);
setProgress(p);
}
void ImgurUploader::authorizationReply(QNetworkReply *reply, AuthorizationCallback callback)
{
reply->deleteLater();
connect(reply, &QNetworkReply::finished, [reply, callback] {
bool authorized = false;
const QJsonObject imgurResponse = QJsonDocument::fromJson(reply->readAll()).object();
if (!imgurResponse.isEmpty() && imgurResponse.contains("access_token")) {
QVariantHash newSettings;
newSettings["access_token"] = imgurResponse.value("access_token").toString();
newSettings["refresh_token"] = imgurResponse.value("refresh_token").toString();
newSettings["account_username"] = imgurResponse.value("account_username").toString();
newSettings["expires_in"] = imgurResponse.value("expires_in").toInt();
- saveSettings("imgur", newSettings);
+ ImgurUploader::saveSettings("imgur", newSettings);
authorized = true;
}
callback(authorized);
});
}
diff --git a/widgets/pomfoptionswidget.cpp b/widgets/pomfoptionswidget.cpp
index 83c58ab..a4d197a 100644
--- a/widgets/pomfoptionswidget.cpp
+++ b/widgets/pomfoptionswidget.cpp
@@ -1,61 +1,98 @@
#include <QJsonObject>
#include <QInputDialog>
#include <QNetworkReply>
#include <QDesktopServices>
#include <QMessageBox>
#include <QRegExpValidator>
#include "pomfoptionswidget.h"
#include "../uploader/uploader.h"
#include "../uploader/pomfuploader.h"
#include "../screenshotmanager.h"
#include "../os.h"
PomfOptionsWidget::PomfOptionsWidget(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
+ ui.progressIndicatorBar->setVisible(false);
+
connect(ui.verifyButton, &QPushButton::clicked, this, [&]() {
ui.verifyButton->setEnabled(false);
- ui.pomfUrlComboBox->setEnabled(false);
+ ui.downloadListButton->setEnabled(false);
+ ui.progressIndicatorBar->setVisible(true);
QPointer<QWidget> guard(parentWidget());
PomfUploader::verify(ui.pomfUrlComboBox->currentText(), [&, guard](bool result) {
if (guard.isNull()) return;
ui.verifyButton->setEnabled(true);
- ui.pomfUrlComboBox->setEnabled(true);
+ ui.downloadListButton->setEnabled(true);
+ ui.progressIndicatorBar->setVisible(false);
if (result) {
ui.verifyButton->setText(tr("Valid uploader!"));
ui.verifyButton->setStyleSheet("color: green;");
ui.verifyButton->setIcon(os::icon("yes"));
} else {
ui.verifyButton->setStyleSheet("color: red;");
ui.verifyButton->setIcon(os::icon("no"));
- ui.verifyButton->setText(tr("Invalid :("));
+ ui.verifyButton->setText(tr("Invalid uploader :("));
}
});
});
connect(ui.pomfUrlComboBox, &QComboBox::currentTextChanged, [&](const QString &text) {
bool validUrl = false;
if (text.startsWith("http://") || text.startsWith("https://")) { // TODO: Something a bit more complex
validUrl = true;
}
- ui.visitButton->setEnabled(validUrl);
ui.verifyButton->setEnabled(validUrl);
if (ui.verifyButton->styleSheet().count() > 0) {
ui.verifyButton->setStyleSheet("");
ui.verifyButton->setIcon(QIcon());
ui.verifyButton->setText(tr("Verify"));
}
});
- connect(ui.visitButton, &QPushButton::clicked, this, [&]() {
- QDesktopServices::openUrl(ui.pomfUrlComboBox->currentText());
+ connect(ui.helpLabel, &QLabel::linkActivated, this, [&](const QString &url) {
+ QDesktopServices::openUrl(url);
+ });
+
+ connect(ui.downloadListButton, &QPushButton::clicked, this, [&]() {
+ ui.verifyButton->setEnabled(false);
+ ui.downloadListButton->setEnabled(false);
+ ui.progressIndicatorBar->setVisible(true);
+
+ auto pomflistReply = Uploader::instance()->nam()->get(QNetworkRequest(QUrl("https://lightscreen.com.ar/pomf.json")));
+
+ QPointer<QWidget> guard(parentWidget());
+ connect(pomflistReply, &QNetworkReply::finished, [&, guard, pomflistReply] {
+ if (guard.isNull()) return;
+
+ ui.verifyButton->setEnabled(true);
+ ui.downloadListButton->setEnabled(true);
+ ui.progressIndicatorBar->setVisible(false);
+
+ if (pomflistReply->error() != QNetworkReply::NoError) {
+ QMessageBox::warning(parentWidget(), tr("Connection error"), pomflistReply->errorString());
+ return;
+ }
+
+ auto pomfListData = QJsonDocument::fromJson(pomflistReply->readAll()).object();
+
+ if (pomfListData.contains("url")) {
+ auto urlList = pomfListData["url"].toArray();
+
+ for (auto url : qAsConst(urlList)) {
+ ui.pomfUrlComboBox->addItem(url.toString());
+ }
+
+ ui.pomfUrlComboBox->showPopup();
+ }
+ });
});
}
diff --git a/widgets/pomfoptionswidget.ui b/widgets/pomfoptionswidget.ui
index 2956498..751b8f9 100644
--- a/widgets/pomfoptionswidget.ui
+++ b/widgets/pomfoptionswidget.ui
@@ -1,66 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PomfOptions</class>
<widget class="QWidget" name="PomfOptions">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>305</width>
- <height>75</height>
+ <width>297</width>
+ <height>84</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
- <layout class="QFormLayout" name="formLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="pomfUrlLabel">
- <property name="text">
- <string>Pomf Clone URL:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
<widget class="QComboBox" name="pomfUrlComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>URL to a pomf.se clone</string>
+ </property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
- <item row="1" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QPushButton" name="visitButton">
- <property name="text">
- <string>Visit Site</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="verifyButton">
- <property name="text">
- <string>Verify</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="1">
+ <item row="4" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>198</width>
- <height>97</height>
+ <width>0</width>
+ <height>0</height>
</size>
</property>
</spacer>
</item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="verifyButton">
+ <property name="text">
+ <string>Verify</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="helpLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;a href=&quot;https://lightscreen.com.ar/help#pomf&quot;&gt;View Help&lt;/a&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QPushButton" name="downloadListButton">
+ <property name="text">
+ <string>Download List</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QProgressBar" name="progressIndicatorBar">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>2</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jun 16, 2:02 AM (2 w, 11 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
70816
Default Alt Text
(15 KB)

Event Timeline