From ae4216de6101db63a1ec7d817852cad2d10863f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Fri, 2 Oct 2015 00:12:53 +0200 Subject: [PATCH] GH-719 implement paste.ee API keys --- application/BuildConfig.cpp.in | 1 + application/BuildConfig.h | 5 + application/CMakeLists.txt | 6 + application/GuiUtil.cpp | 8 +- application/MultiMC.cpp | 4 + application/pages/OtherLogsPage.cpp | 2 +- application/pages/global/PasteEEPage.cpp | 88 ++++++++++++++ application/pages/global/PasteEEPage.h | 62 ++++++++++ application/pages/global/PasteEEPage.ui | 139 +++++++++++++++++++++++ logic/net/PasteUpload.cpp | 31 +++-- logic/net/PasteUpload.h | 15 ++- 11 files changed, 345 insertions(+), 16 deletions(-) create mode 100644 application/pages/global/PasteEEPage.cpp create mode 100644 application/pages/global/PasteEEPage.h create mode 100644 application/pages/global/PasteEEPage.ui diff --git a/application/BuildConfig.cpp.in b/application/BuildConfig.cpp.in index 16920cb2..36337aa4 100644 --- a/application/BuildConfig.cpp.in +++ b/application/BuildConfig.cpp.in @@ -20,6 +20,7 @@ Config::Config() GIT_COMMIT = "@MultiMC_GIT_COMMIT@"; VERSION_STR = "@MultiMC_VERSION_STRING@"; NEWS_RSS_URL = "@MultiMC_NEWS_RSS_URL@"; + PASTE_EE_KEY = "@MultiMC_PASTE_EE_API_KEY@"; } QString Config::printableVersionString() const diff --git a/application/BuildConfig.h b/application/BuildConfig.h index 8a6a76b5..a81d16ed 100644 --- a/application/BuildConfig.h +++ b/application/BuildConfig.h @@ -47,6 +47,11 @@ public: */ 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. * \return The version number in string format (major.minor.revision.build). diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index 29012157..fdb27607 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -29,6 +29,9 @@ set(MultiMC_UPDATER false CACHE BOOL "Whether or not the update system is enable # Notification URL 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 include(GitFunctions) 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/ProxyPage.cpp pages/global/ProxyPage.h + pages/global/PasteEEPage.cpp + pages/global/PasteEEPage.h # GUI - dialogs dialogs/AboutDialog.cpp @@ -289,6 +294,7 @@ SET(MULTIMC_UIS pages/global/MinecraftPage.ui pages/global/MultiMCPage.ui pages/global/ProxyPage.ui + pages/global/PasteEEPage.ui # Dialogs dialogs/CopyInstanceDialog.ui diff --git a/application/GuiUtil.cpp b/application/GuiUtil.cpp index 442922cd..cc06d711 100644 --- a/application/GuiUtil.cpp +++ b/application/GuiUtil.cpp @@ -11,11 +11,17 @@ #include "MultiMC.h" #include +#include void GuiUtil::uploadPaste(const QString &text, QWidget *parentWidget) { ProgressDialog dialog(parentWidget); - std::unique_ptr paste(new PasteUpload(parentWidget, text)); + auto APIKeySetting = MMC->settings()->get("PasteEEAPIKey").toString(); + if(APIKeySetting == "multimc") + { + APIKeySetting = BuildConfig.PASTE_EE_KEY; + } + std::unique_ptr paste(new PasteUpload(parentWidget, text, APIKeySetting)); if (!paste->validateText()) { diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 3b2003e4..612ba342 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -7,6 +7,7 @@ #include "pages/global/ProxyPage.h" #include "pages/global/ExternalToolsPage.h" #include "pages/global/AccountListPage.h" +#include "pages/global/PasteEEPage.h" #include #include @@ -535,6 +536,8 @@ void MultiMC::initGlobalSettings(bool test_mode) // Jar mod nag dialog in version page m_settings->registerSetting("JarModNagSeen", false); + // paste.ee API key + m_settings->registerSetting("PasteEEAPIKey", "multimc"); // Init page provider { @@ -545,6 +548,7 @@ void MultiMC::initGlobalSettings(bool test_mode) m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); + m_globalSettingsProvider->addPage(); } } diff --git a/application/pages/OtherLogsPage.cpp b/application/pages/OtherLogsPage.cpp index 74257a83..f1b59f1e 100644 --- a/application/pages/OtherLogsPage.cpp +++ b/application/pages/OtherLogsPage.cpp @@ -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 " "for large files.").arg(file.fileName())); }; - if(file.size() >= 10000000ll) + if(file.size() > (1024ll * 1024ll * 12ll)) { showTooBig(); return; diff --git a/application/pages/global/PasteEEPage.cpp b/application/pages/global/PasteEEPage.cpp new file mode 100644 index 00000000..e6827601 --- /dev/null +++ b/application/pages/global/PasteEEPage.cpp @@ -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 +#include +#include + +#include + +#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); +} diff --git a/application/pages/global/PasteEEPage.h b/application/pages/global/PasteEEPage.h new file mode 100644 index 00000000..99384373 --- /dev/null +++ b/application/pages/global/PasteEEPage.h @@ -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 + +#include "pages/BasePage.h" +#include + +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; +}; diff --git a/application/pages/global/PasteEEPage.ui b/application/pages/global/PasteEEPage.ui new file mode 100644 index 00000000..84da2b5a --- /dev/null +++ b/application/pages/global/PasteEEPage.ui @@ -0,0 +1,139 @@ + + + PasteEEPage + + + + 0 + 0 + 491 + 474 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + Tab 1 + + + + + + paste.ee API key + + + + + + No key - &2MB upload limit + + + pasteButtonGroup + + + + + + + MultiMC key - 12MB &upload limit + + + pasteButtonGroup + + + + + + + &Your own key - 12MB upload limit: + + + pasteButtonGroup + + + + + + + QLineEdit::Password + + + Paste your API key here! + + + + + + + Qt::Horizontal + + + + + + + <html><head/><body><p><a href="https://paste.ee"><span style=" text-decoration: underline; color:#2980b9;">paste.ee</span></a> is used by MultiMC for log uploads. If you have a <a href="https://paste.ee"><span style=" text-decoration: underline; color:#2980b9;">paste.ee</span></a> account, you can add your API key here and have your uploaded logs paired with your account.</p></body></html> + + + Qt::RichText + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 216 + + + + + + + + + + + + tabWidget + publicButton + multimcButton + customButton + customAPIkeyEdit + + + + + + + diff --git a/logic/net/PasteUpload.cpp b/logic/net/PasteUpload.cpp index cfbc561d..4b671d6f 100644 --- a/logic/net/PasteUpload.cpp +++ b/logic/net/PasteUpload.cpp @@ -4,33 +4,44 @@ #include #include -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_text.replace('\n', "\r\n"); + m_key = key; + 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() { - return m_text.size() <= maxSize(); + return m_textSize <= maxSize(); } void PasteUpload::executeTask() { QNetworkRequest request(QUrl("http://paste.ee/api")); 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-Length", QByteArray::number(content.size())); + request.setRawHeader("Content-Length", QByteArray::number(m_text.size())); auto worker = ENV.qnam(); - QNetworkReply *rep = worker->post(request, content); + QNetworkReply *rep = worker->post(request, buf); m_reply = std::shared_ptr(rep); 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(finished()), this, SLOT(downloadFinished())); } diff --git a/logic/net/PasteUpload.h b/logic/net/PasteUpload.h index 11850c71..5bc3d276 100644 --- a/logic/net/PasteUpload.h +++ b/logic/net/PasteUpload.h @@ -2,6 +2,7 @@ #include "tasks/Task.h" #include #include +#include #include #include "multimc_logic_export.h" @@ -10,8 +11,8 @@ class MULTIMC_LOGIC_EXPORT PasteUpload : public Task { Q_OBJECT public: - PasteUpload(QWidget *window, QString text); - virtual ~PasteUpload(){}; + PasteUpload(QWidget *window, QString text, QString key = "public"); + virtual ~PasteUpload(); QString pasteLink() { return m_pasteLink; @@ -22,8 +23,11 @@ public: } uint32_t maxSize() { - // 2MB for paste.ee - return 1024*1024*2; + // 2MB for paste.ee - public + if(m_key == "public") + return 1024*1024*2; + // 12MB for paste.ee - with actual key + return 1024*1024*12; } bool validateText(); protected: @@ -36,6 +40,9 @@ private: QWidget *m_window; QString m_pasteID; QString m_pasteLink; + QString m_key; + int m_textSize = 0; + QBuffer * buf = nullptr; std::shared_ptr m_reply; public slots: