GH-719 implement paste.ee API keys

This commit is contained in:
Petr Mrázek 2015-10-02 00:12:53 +02:00
parent ac8ff88061
commit ae4216de61
11 changed files with 345 additions and 16 deletions

View File

@ -20,6 +20,7 @@ Config::Config()
GIT_COMMIT = "@MultiMC_GIT_COMMIT@"; GIT_COMMIT = "@MultiMC_GIT_COMMIT@";
VERSION_STR = "@MultiMC_VERSION_STRING@"; VERSION_STR = "@MultiMC_VERSION_STRING@";
NEWS_RSS_URL = "@MultiMC_NEWS_RSS_URL@"; NEWS_RSS_URL = "@MultiMC_NEWS_RSS_URL@";
PASTE_EE_KEY = "@MultiMC_PASTE_EE_API_KEY@";
} }
QString Config::printableVersionString() const QString Config::printableVersionString() const

View File

@ -47,6 +47,11 @@ public:
*/ */
QString NEWS_RSS_URL; QString NEWS_RSS_URL;
/**
* API key you can get from paste.ee when you register an account
*/
QString PASTE_EE_KEY;
/** /**
* \brief Converts the Version to a string. * \brief Converts the Version to a string.
* \return The version number in string format (major.minor.revision.build). * \return The version number in string format (major.minor.revision.build).

View File

@ -29,6 +29,9 @@ set(MultiMC_UPDATER false CACHE BOOL "Whether or not the update system is enable
# Notification URL # Notification URL
set(MultiMC_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.") set(MultiMC_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.")
# paste.ee API key
set(MultiMC_PASTE_EE_API_KEY "" CACHE STRING "API key you can get from paste.ee when you register an account")
#### Check the current Git commit #### Check the current Git commit
include(GitFunctions) include(GitFunctions)
git_run(COMMAND rev-parse HEAD DEFAULT "Unknown" OUTPUT_VAR MultiMC_GIT_COMMIT) git_run(COMMAND rev-parse HEAD DEFAULT "Unknown" OUTPUT_VAR MultiMC_GIT_COMMIT)
@ -199,6 +202,8 @@ SET(MULTIMC_SOURCES
pages/global/MultiMCPage.h pages/global/MultiMCPage.h
pages/global/ProxyPage.cpp pages/global/ProxyPage.cpp
pages/global/ProxyPage.h pages/global/ProxyPage.h
pages/global/PasteEEPage.cpp
pages/global/PasteEEPage.h
# GUI - dialogs # GUI - dialogs
dialogs/AboutDialog.cpp dialogs/AboutDialog.cpp
@ -289,6 +294,7 @@ SET(MULTIMC_UIS
pages/global/MinecraftPage.ui pages/global/MinecraftPage.ui
pages/global/MultiMCPage.ui pages/global/MultiMCPage.ui
pages/global/ProxyPage.ui pages/global/ProxyPage.ui
pages/global/PasteEEPage.ui
# Dialogs # Dialogs
dialogs/CopyInstanceDialog.ui dialogs/CopyInstanceDialog.ui

View File

@ -11,11 +11,17 @@
#include "MultiMC.h" #include "MultiMC.h"
#include <settings/SettingsObject.h> #include <settings/SettingsObject.h>
#include <BuildConfig.h>
void GuiUtil::uploadPaste(const QString &text, QWidget *parentWidget) void GuiUtil::uploadPaste(const QString &text, QWidget *parentWidget)
{ {
ProgressDialog dialog(parentWidget); ProgressDialog dialog(parentWidget);
std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, text)); auto APIKeySetting = MMC->settings()->get("PasteEEAPIKey").toString();
if(APIKeySetting == "multimc")
{
APIKeySetting = BuildConfig.PASTE_EE_KEY;
}
std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, text, APIKeySetting));
if (!paste->validateText()) if (!paste->validateText())
{ {

View File

@ -7,6 +7,7 @@
#include "pages/global/ProxyPage.h" #include "pages/global/ProxyPage.h"
#include "pages/global/ExternalToolsPage.h" #include "pages/global/ExternalToolsPage.h"
#include "pages/global/AccountListPage.h" #include "pages/global/AccountListPage.h"
#include "pages/global/PasteEEPage.h"
#include <iostream> #include <iostream>
#include <QDir> #include <QDir>
@ -535,6 +536,8 @@ void MultiMC::initGlobalSettings(bool test_mode)
// Jar mod nag dialog in version page // Jar mod nag dialog in version page
m_settings->registerSetting("JarModNagSeen", false); m_settings->registerSetting("JarModNagSeen", false);
// paste.ee API key
m_settings->registerSetting("PasteEEAPIKey", "multimc");
// Init page provider // Init page provider
{ {
@ -545,6 +548,7 @@ void MultiMC::initGlobalSettings(bool test_mode)
m_globalSettingsProvider->addPage<ProxyPage>(); m_globalSettingsProvider->addPage<ProxyPage>();
m_globalSettingsProvider->addPage<ExternalToolsPage>(); m_globalSettingsProvider->addPage<ExternalToolsPage>();
m_globalSettingsProvider->addPage<AccountListPage>(); m_globalSettingsProvider->addPage<AccountListPage>();
m_globalSettingsProvider->addPage<PasteEEPage>();
} }
} }

View File

@ -121,7 +121,7 @@ void OtherLogsPage::on_btnReload_clicked()
tr("The file (%1) is too big. You may want to open it in a viewer optimized " tr("The file (%1) is too big. You may want to open it in a viewer optimized "
"for large files.").arg(file.fileName())); "for large files.").arg(file.fileName()));
}; };
if(file.size() >= 10000000ll) if(file.size() > (1024ll * 1024ll * 12ll))
{ {
showTooBig(); showTooBig();
return; return;

View File

@ -0,0 +1,88 @@
/* Copyright 2013-2015 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "PasteEEPage.h"
#include "ui_PasteEEPage.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardPaths>
#include <pathutils.h>
#include "settings/SettingsObject.h"
#include "tools/BaseProfiler.h"
#include "MultiMC.h"
PasteEEPage::PasteEEPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::PasteEEPage)
{
ui->setupUi(this);
ui->tabWidget->tabBar()->hide();\
connect(ui->customAPIkeyEdit, &QLineEdit::textEdited, this, &PasteEEPage::textEdited);
loadSettings();
}
PasteEEPage::~PasteEEPage()
{
delete ui;
}
void PasteEEPage::loadSettings()
{
auto s = MMC->settings();
QString keyToUse = s->get("PasteEEAPIKey").toString();
if(keyToUse == "public")
{
ui->publicButton->setChecked(true);
}
else if(keyToUse == "multimc")
{
ui->multimcButton->setChecked(true);
}
else
{
ui->customButton->setChecked(true);
ui->customAPIkeyEdit->setText(keyToUse);
}
}
void PasteEEPage::applySettings()
{
auto s = MMC->settings();
QString pasteKeyToUse;
if (ui->customButton->isChecked())
pasteKeyToUse = ui->customAPIkeyEdit->text();
else if (ui->publicButton->isChecked())
pasteKeyToUse = "public";
else
{
pasteKeyToUse = "multimc";
}
s->set("PasteEEAPIKey", pasteKeyToUse);
}
bool PasteEEPage::apply()
{
applySettings();
return true;
}
void PasteEEPage::textEdited(const QString& text)
{
ui->customButton->setChecked(true);
}

View File

@ -0,0 +1,62 @@
/* Copyright 2013-2015 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <QWidget>
#include "pages/BasePage.h"
#include <MultiMC.h>
namespace Ui {
class PasteEEPage;
}
class PasteEEPage : public QWidget, public BasePage
{
Q_OBJECT
public:
explicit PasteEEPage(QWidget *parent = 0);
~PasteEEPage();
QString displayName() const override
{
return tr("Log Upload");
}
QIcon icon() const override
{
return MMC->getThemedIcon("log");
}
QString id() const override
{
return "log-upload";
}
QString helpPage() const override
{
return "Log-Upload";
}
virtual bool apply() override;
private:
void loadSettings();
void applySettings();
private slots:
void textEdited(const QString &text);
private:
Ui::PasteEEPage *ui;
};

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PasteEEPage</class>
<widget class="QWidget" name="PasteEEPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>491</width>
<height>474</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Tab 1</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>paste.ee API key</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QRadioButton" name="publicButton">
<property name="text">
<string>No key - &amp;2MB upload limit</string>
</property>
<attribute name="buttonGroup">
<string notr="true">pasteButtonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="multimcButton">
<property name="text">
<string>MultiMC key - 12MB &amp;upload limit</string>
</property>
<attribute name="buttonGroup">
<string notr="true">pasteButtonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="customButton">
<property name="text">
<string>&amp;Your own key - 12MB upload limit:</string>
</property>
<attribute name="buttonGroup">
<string notr="true">pasteButtonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QLineEdit" name="customAPIkeyEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Paste your API key here!</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://paste.ee&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;paste.ee&lt;/span&gt;&lt;/a&gt; is used by MultiMC for log uploads. If you have a &lt;a href=&quot;https://paste.ee&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;paste.ee&lt;/span&gt;&lt;/a&gt; account, you can add your API key here and have your uploaded logs paired with your account.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>216</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>publicButton</tabstop>
<tabstop>multimcButton</tabstop>
<tabstop>customButton</tabstop>
<tabstop>customAPIkeyEdit</tabstop>
</tabstops>
<resources/>
<connections/>
<buttongroups>
<buttongroup name="pasteButtonGroup"/>
</buttongroups>
</ui>

View File

@ -4,33 +4,44 @@
#include <QJsonObject> #include <QJsonObject>
#include <QJsonDocument> #include <QJsonDocument>
PasteUpload::PasteUpload(QWidget *window, QString text) : m_window(window) PasteUpload::PasteUpload(QWidget *window, QString text, QString key) : m_window(window)
{ {
m_text = text.toUtf8(); m_key = key;
m_text.replace('\n', "\r\n"); QByteArray temp;
temp = text.toUtf8();
temp.replace('\n', "\r\n");
m_textSize = temp.size();
m_text = "key=" + m_key.toLatin1() + "&description=MultiMC5+Log+File&language=plain&format=json&expire=2592000&paste=" + temp.toPercentEncoding();
buf = new QBuffer(&m_text);
}
PasteUpload::~PasteUpload()
{
if(buf)
{
delete buf;
}
} }
bool PasteUpload::validateText() bool PasteUpload::validateText()
{ {
return m_text.size() <= maxSize(); return m_textSize <= maxSize();
} }
void PasteUpload::executeTask() void PasteUpload::executeTask()
{ {
QNetworkRequest request(QUrl("http://paste.ee/api")); QNetworkRequest request(QUrl("http://paste.ee/api"));
request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)");
QByteArray content(
"key=public&description=MultiMC5+Log+File&language=plain&format=json&expire=2592000&paste=" +
m_text.toPercentEncoding());
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
request.setRawHeader("Content-Length", QByteArray::number(content.size())); request.setRawHeader("Content-Length", QByteArray::number(m_text.size()));
auto worker = ENV.qnam(); auto worker = ENV.qnam();
QNetworkReply *rep = worker->post(request, content); QNetworkReply *rep = worker->post(request, buf);
m_reply = std::shared_ptr<QNetworkReply>(rep); m_reply = std::shared_ptr<QNetworkReply>(rep);
setStatus(tr("Uploading to paste.ee")); setStatus(tr("Uploading to paste.ee"));
connect(rep, &QNetworkReply::downloadProgress, this, &Task::setProgress); connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress);
connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished()));
} }

View File

@ -2,6 +2,7 @@
#include "tasks/Task.h" #include "tasks/Task.h"
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkReply> #include <QNetworkReply>
#include <QBuffer>
#include <memory> #include <memory>
#include "multimc_logic_export.h" #include "multimc_logic_export.h"
@ -10,8 +11,8 @@ class MULTIMC_LOGIC_EXPORT PasteUpload : public Task
{ {
Q_OBJECT Q_OBJECT
public: public:
PasteUpload(QWidget *window, QString text); PasteUpload(QWidget *window, QString text, QString key = "public");
virtual ~PasteUpload(){}; virtual ~PasteUpload();
QString pasteLink() QString pasteLink()
{ {
return m_pasteLink; return m_pasteLink;
@ -22,8 +23,11 @@ public:
} }
uint32_t maxSize() uint32_t maxSize()
{ {
// 2MB for paste.ee // 2MB for paste.ee - public
if(m_key == "public")
return 1024*1024*2; return 1024*1024*2;
// 12MB for paste.ee - with actual key
return 1024*1024*12;
} }
bool validateText(); bool validateText();
protected: protected:
@ -36,6 +40,9 @@ private:
QWidget *m_window; QWidget *m_window;
QString m_pasteID; QString m_pasteID;
QString m_pasteLink; QString m_pasteLink;
QString m_key;
int m_textSize = 0;
QBuffer * buf = nullptr;
std::shared_ptr<QNetworkReply> m_reply; std::shared_ptr<QNetworkReply> m_reply;
public public
slots: slots: