diff options
-rw-r--r-- | application/BuildConfig.cpp.in | 1 | ||||
-rw-r--r-- | application/BuildConfig.h | 5 | ||||
-rw-r--r-- | application/CMakeLists.txt | 6 | ||||
-rw-r--r-- | application/GuiUtil.cpp | 8 | ||||
-rw-r--r-- | application/MultiMC.cpp | 4 | ||||
-rw-r--r-- | application/pages/OtherLogsPage.cpp | 2 | ||||
-rw-r--r-- | application/pages/global/PasteEEPage.cpp | 88 | ||||
-rw-r--r-- | application/pages/global/PasteEEPage.h | 62 | ||||
-rw-r--r-- | application/pages/global/PasteEEPage.ui | 139 | ||||
-rw-r--r-- | logic/net/PasteUpload.cpp | 31 | ||||
-rw-r--r-- | logic/net/PasteUpload.h | 15 |
11 files changed, 345 insertions, 16 deletions
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 @@ -48,6 +48,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 <settings/SettingsObject.h> +#include <BuildConfig.h> void GuiUtil::uploadPaste(const QString &text, QWidget *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()) { 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 <iostream> #include <QDir> @@ -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<ProxyPage>(); m_globalSettingsProvider->addPage<ExternalToolsPage>(); m_globalSettingsProvider->addPage<AccountListPage>(); + m_globalSettingsProvider->addPage<PasteEEPage>(); } } 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 <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); +} 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 <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; +}; 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 @@ +<?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 - &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 &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>&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><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></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> 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 <QJsonObject> #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_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<QNetworkReply>(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 <QMessageBox> #include <QNetworkReply> +#include <QBuffer> #include <memory> #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<QNetworkReply> m_reply; public slots: |