diff --git a/flameshot.pro b/flameshot.pro index 93a4e828..86ba63b3 100644 --- a/flameshot.pro +++ b/flameshot.pro @@ -85,6 +85,7 @@ DEFINES += QAPPLICATION_CLASS=QApplication SOURCES += src/main.cpp \ src/config/filepathconfiguration.cpp \ + src/tools/imgs3/imgs3settings.cpp \ src/widgets/historywidget.cpp \ src/utils/configenterprise.cpp \ src/utils/history.cpp \ @@ -164,6 +165,7 @@ SOURCES += src/main.cpp \ HEADERS += src/widgets/capture/buttonhandler.h \ src/config/filepathconfiguration.h \ + src/tools/imgs3/imgs3settings.h \ src/widgets/historywidget.h \ src/utils/configenterprise.h \ src/utils/history.h \ diff --git a/src/tools/imgs3/imgs3settings.cpp b/src/tools/imgs3/imgs3settings.cpp new file mode 100644 index 00000000..9fef1c02 --- /dev/null +++ b/src/tools/imgs3/imgs3settings.cpp @@ -0,0 +1,35 @@ +#include "imgs3settings.h" +#include "src/utils/configenterprise.h" +#include + +ImgS3Settings::ImgS3Settings() +{ + m_configEnterprise = new ConfigEnterprise(); + + // get s3 credentials + QSettings *settings = m_configEnterprise->settings(); + settings->beginGroup("S3"); + + m_credsUrl = settings->value("S3_CREDS_URL").toString(); + m_credsUrl = m_credsUrl + (m_credsUrl.length() > 0 && m_credsUrl.at(m_credsUrl.length() - 1) == "/" ? "" : "/") + S3_API_IMG_PATH; + + m_xApiKey = settings->value("S3_X_API_KEY").toString(); + + m_url = settings->value("S3_URL").toString(); + m_url = m_url + (m_url.length() > 0 && m_url.at(m_url.length() - 1) == "/" ? "" : "/"); + + settings->endGroup(); + +} + +const QString &ImgS3Settings::credsUrl() { + return m_credsUrl; +} + +const QString &ImgS3Settings::xApiKey() { + return m_xApiKey; +} + +const QString &ImgS3Settings::url() { + return m_url; +} diff --git a/src/tools/imgs3/imgs3settings.h b/src/tools/imgs3/imgs3settings.h new file mode 100644 index 00000000..d44b79e2 --- /dev/null +++ b/src/tools/imgs3/imgs3settings.h @@ -0,0 +1,27 @@ +#ifndef IMGS3SETTINGS_H +#define IMGS3SETTINGS_H + +#define S3_API_IMG_PATH "v2/image/" + + +#include + +class ConfigEnterprise; + +class ImgS3Settings +{ +public: + ImgS3Settings(); + + const QString &credsUrl(); + const QString &xApiKey(); + const QString &url(); + +private: + ConfigEnterprise *m_configEnterprise; + QString m_credsUrl; + QString m_xApiKey; + QString m_url; +}; + +#endif // IMGS3SETTINGS_H diff --git a/src/tools/imgs3/imgs3uploader.cpp b/src/tools/imgs3/imgs3uploader.cpp index ca3441e9..a8932e41 100644 --- a/src/tools/imgs3/imgs3uploader.cpp +++ b/src/tools/imgs3/imgs3uploader.cpp @@ -50,15 +50,25 @@ ImgS3Uploader::ImgS3Uploader(const QPixmap &capture, QWidget *parent) : QWidget(parent), m_pixmap(capture) { + init(tr("Upload image to S3"), tr("Uploading Image")); +} + +ImgS3Uploader::ImgS3Uploader(QWidget *parent) : + QWidget(parent) +{ + init(tr("Delete image from S3"), tr("Deleting Image")); +} + +void ImgS3Uploader::init(const QString &title, const QString &label) { m_proxy = nullptr; - setWindowTitle(tr("Upload to ImgS3")); + setWindowTitle(title); setWindowIcon(QIcon(":img/app/flameshot.svg")); m_spinner = new LoadSpinner(this); m_spinner->setColor(ConfigHandler().uiMainColorValue()); m_spinner->start(); - m_infoLabel = new QLabel(tr("Uploading Image")); + m_infoLabel = new QLabel(label); m_vLayout = new QVBoxLayout(); setLayout(m_vLayout); @@ -71,23 +81,19 @@ ImgS3Uploader::ImgS3Uploader(const QPixmap &capture, QWidget *parent) : m_configEnterprise = new ConfigEnterprise(); // get s3 credentials - QSettings *settings = m_configEnterprise->settings(); - settings->beginGroup("S3"); - m_s3CredsUrl = settings->value("S3_CREDS_URL").toString(); - m_s3XApiKey = settings->value("S3_X_API_KEY").toString(); - settings->endGroup(); - initNetwork(); - upload(); } void ImgS3Uploader::initNetwork() { // Init network - m_NetworkAM = new QNetworkAccessManager(this); - connect(m_NetworkAM, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReply); + m_NetworkAMUpload = new QNetworkAccessManager(this); + connect(m_NetworkAMUpload, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyUpload); - m_NetworkAMCreds = new QNetworkAccessManager(this); - connect(m_NetworkAMCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleCredsReply); + m_NetworkAMGetCreds = new QNetworkAccessManager(this); + connect(m_NetworkAMGetCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyGetCreds); + + m_NetworkAMRemove = new QNetworkAccessManager(this); + connect(m_NetworkAMRemove, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyDeleteResource); // get proxy settings from "config.ini" file QSettings *settings = m_configEnterprise->settings(); @@ -137,7 +143,7 @@ void ImgS3Uploader::initNetwork() { } else { // Get proxy settings from OS settings - QNetworkProxyQuery q(QUrl(m_s3CredsUrl.toUtf8())); + QNetworkProxyQuery q(QUrl(m_s3Settings.credsUrl().toUtf8())); q.setQueryType(QNetworkProxyQuery::UrlRequest); q.setProtocolTag("http"); @@ -160,10 +166,10 @@ void ImgS3Uploader::initNetwork() { qDebug() << "proxy user:" << (m_proxy->user().length() > 0 ? m_proxy->user() : "no user"); qDebug() << "proxy password:" << (m_proxy->password().length() > 0 ? "***" : "no password"); - QNetworkProxy::setApplicationProxy(*m_proxy); - m_NetworkAM->setProxy(*m_proxy); - m_NetworkAMCreds->setProxy(*m_proxy); + m_NetworkAMUpload->setProxy(*m_proxy); + m_NetworkAMGetCreds->setProxy(*m_proxy); + m_NetworkAMRemove->setProxy(*m_proxy); } else { qDebug() << "No proxy"; @@ -171,15 +177,16 @@ void ImgS3Uploader::initNetwork() { } -void ImgS3Uploader::handleReply(QNetworkReply *reply) { +void ImgS3Uploader::handleReplyUpload(QNetworkReply *reply) { m_spinner->deleteLater(); if (reply->error() == QNetworkReply::NoError) { // save history QString imageName = m_imageURL.toString(); int lastSlash = imageName.lastIndexOf("/"); if (lastSlash >= 0) { - imageName = imageName.mid(lastSlash); + imageName = imageName.mid(lastSlash + 1); } + imageName = m_deleteToken + "-" + imageName; History history; history.save(m_pixmap, imageName); @@ -198,6 +205,20 @@ void ImgS3Uploader::handleReply(QNetworkReply *reply) { new QShortcut(Qt::Key_Escape, this, SLOT(close())); } +void ImgS3Uploader::handleReplyDeleteResource(QNetworkReply *reply) { + m_spinner->deleteLater(); + if (reply->error() == QNetworkReply::NoError) { + if (ConfigHandler().copyAndCloseAfterUploadEnabled()) { + SystemNotification().sendMessage(QObject::tr("File is deleted from S3")); + close(); + } + } else { + QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); + m_infoLabel->setText(reply->errorString()); + } + new QShortcut(Qt::Key_Escape, this, SLOT(close())); +} + void ImgS3Uploader::startDrag() { QMimeData *mimeData = new QMimeData; mimeData->setUrls(QList { m_imageURL }); @@ -210,12 +231,12 @@ void ImgS3Uploader::startDrag() { dragHandler->exec(); } -void ImgS3Uploader::handleCredsReply(QNetworkReply *reply){ +void ImgS3Uploader::handleReplyGetCreds(QNetworkReply *reply){ if (reply->error() == QNetworkReply::NoError) { QJsonDocument response = QJsonDocument::fromJson(reply->readAll()); uploadToS3(response); } else { - if(m_s3CredsUrl.length() == 0){ + if(m_s3Settings.credsUrl().length() == 0){ m_infoLabel->setText("S3 Creds URL is not found in your configuration file"); } else { @@ -234,6 +255,7 @@ void ImgS3Uploader::uploadToS3(QJsonDocument &response) { QString resultURL = json["resultURL"].toString(); QJsonObject formData = json["formData"].toObject(); QString url = formData["url"].toString(); + m_deleteToken = json["deleteToken"].toString(); QJsonObject fields = formData["fields"].toObject(); foreach (auto key, fields.keys()) { @@ -261,17 +283,26 @@ void ImgS3Uploader::uploadToS3(QJsonDocument &response) { QUrl qUrl(url); QNetworkRequest request(qUrl); - m_NetworkAM->post(request, multiPart); + m_NetworkAMUpload->post(request, multiPart); +} + +void ImgS3Uploader::deleteResource(const QString &fileName, const QString &deleteToken) { + QNetworkRequest request; + request.setUrl(m_s3Settings.credsUrl().toUtf8() + fileName); + request.setRawHeader("X-API-Key", m_s3Settings.xApiKey().toLatin1()); + request.setRawHeader("Authorization", "Bearer " + deleteToken.toLatin1()); + m_NetworkAMRemove->deleteResource(request); } void ImgS3Uploader::upload() { // get creads - QUrl creds(m_s3CredsUrl); + QUrl creds(m_s3Settings.credsUrl()); QNetworkRequest requestCreds(creds); - if(m_s3XApiKey.length() > 0) { - requestCreds.setRawHeader(QByteArray("X-API-Key"), QByteArray(m_s3XApiKey.toLocal8Bit())); + if(m_s3Settings.xApiKey().length() > 0) { + requestCreds.setRawHeader(QByteArray("X-API-Key"), QByteArray(m_s3Settings.xApiKey().toLocal8Bit())); } - m_NetworkAMCreds->get(requestCreds); + m_deleteToken.clear(); + m_NetworkAMGetCreds->get(requestCreds); } void ImgS3Uploader::onUploadOk() { diff --git a/src/tools/imgs3/imgs3uploader.h b/src/tools/imgs3/imgs3uploader.h index 3df0a224..c7454258 100644 --- a/src/tools/imgs3/imgs3uploader.h +++ b/src/tools/imgs3/imgs3uploader.h @@ -17,6 +17,9 @@ #pragma once +#define S3_API_IMG_PATH "v2/image/" + +#include "imgs3settings.h" #include #include @@ -36,10 +39,14 @@ class ImgS3Uploader : public QWidget { Q_OBJECT public: explicit ImgS3Uploader(const QPixmap &capture, QWidget *parent = nullptr); + explicit ImgS3Uploader(QWidget *parent = nullptr); + void upload(); + void deleteResource(const QString &, const QString &); private slots: - void handleReply(QNetworkReply *reply); - void handleCredsReply(QNetworkReply *reply); + void handleReplyUpload(QNetworkReply *reply); + void handleReplyGetCreds(QNetworkReply *reply); + void handleReplyDeleteResource(QNetworkReply *reply); void startDrag(); void openURL(); @@ -47,19 +54,24 @@ private slots: void copyImage(); private: + void init(const QString &title, const QString &label); void uploadToS3(QJsonDocument &response); void initNetwork(); + void onUploadOk(); + +// class members private: ConfigEnterprise *m_configEnterprise; - QString m_s3CredsUrl; - QString m_s3XApiKey; + ImgS3Settings m_s3Settings; + QString m_deleteToken; QString m_hostName; QPixmap m_pixmap; QNetworkProxy *m_proxy; - QNetworkAccessManager *m_NetworkAM; - QNetworkAccessManager *m_NetworkAMCreds; + QNetworkAccessManager *m_NetworkAMUpload; + QNetworkAccessManager *m_NetworkAMGetCreds; + QNetworkAccessManager *m_NetworkAMRemove; QVBoxLayout *m_vLayout; QHBoxLayout *m_hLayout; @@ -73,6 +85,4 @@ private: QUrl m_imageURL; NotificationWidget *m_notification; - void upload(); - void onUploadOk(); }; diff --git a/src/tools/imgs3/imgs3uploadertool.cpp b/src/tools/imgs3/imgs3uploadertool.cpp index 99bf1856..45f04aaf 100644 --- a/src/tools/imgs3/imgs3uploadertool.cpp +++ b/src/tools/imgs3/imgs3uploadertool.cpp @@ -47,7 +47,9 @@ QString ImgS3UploaderTool::description() const { } QWidget *ImgS3UploaderTool::widget() { - return new ImgS3Uploader(capture); + ImgS3Uploader *p = new ImgS3Uploader(capture); + p->upload(); + return p; } void ImgS3UploaderTool::setCapture(const QPixmap &pixmap) { diff --git a/src/widgets/historywidget.cpp b/src/widgets/historywidget.cpp index d13c68f3..a7131891 100644 --- a/src/widgets/historywidget.cpp +++ b/src/widgets/historywidget.cpp @@ -1,7 +1,7 @@ #include "historywidget.h" #include "src/utils/history.h" -#include "src/utils/configenterprise.h" #include "src/widgets/notificationwidget.h" +#include "src/tools/imgs3/imgs3uploader.h" #include #include #include @@ -45,11 +45,6 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QDialog(parent) void HistoryWidget::loadHistory() { // get settings - ConfigEnterprise configEnterprise; - QSettings *settings = configEnterprise.settings(); - settings->beginGroup("S3"); - QString s3BaseUrl = settings->value("S3_URL").toString(); - settings->endGroup(); // read history files History history = History(); @@ -61,7 +56,7 @@ void HistoryWidget::loadHistory() { else { // generate history list foreach(QString fileName, historyFiles) { - addLine(s3BaseUrl + fileName, history.path() + fileName); + addLine(history.path(), fileName); } } } @@ -76,8 +71,20 @@ void HistoryWidget::setEmptyMessage() { m_pVBox->addWidget(buttonEmpty); } -void HistoryWidget::addLine(const QString &url, const QString &fullFileName) { +void HistoryWidget::addLine(const QString &path, const QString& fileName) { QHBoxLayout *phbl = new QHBoxLayout(); + QString fullFileName = path + fileName; + QString s3FileName = fileName; + + // + QString deleteToken; + int nSeparatorIndex = s3FileName.indexOf("-"); + if(nSeparatorIndex >= 0) { + deleteToken = s3FileName.mid(0, nSeparatorIndex); + s3FileName = s3FileName.mid(nSeparatorIndex + 1, s3FileName.size()); + } + QString url = m_s3Settings.url() + s3FileName; + // load pixmap QPixmap pixmap; @@ -129,9 +136,14 @@ void HistoryWidget::addLine(const QString &url, const QString &fullFileName) { QPushButton *buttonDelete = new QPushButton; buttonDelete->setIcon(QIcon(":/img/material/black/delete.svg")); buttonDelete->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - connect(buttonDelete, &QPushButton::clicked, this, [=](){ - removeItem(phbl, fullFileName); - }); + if(deleteToken.size() > 0) { + connect(buttonDelete, &QPushButton::clicked, this, [=](){ + removeItem(phbl, fullFileName, s3FileName, deleteToken); + }); + } + else { + buttonDelete->setDisabled(true); + } // layout phbl->addWidget(pScreenshot); @@ -151,26 +163,29 @@ void HistoryWidget::addLine(const QString &url, const QString &fullFileName) { m_pVBox->addLayout(phbl); } -void HistoryWidget::removeItem(QLayout *pl, const QString &fullFileName) { - // TODO - send delete request - qDebug() << "Delete image on S3"; +void HistoryWidget::removeItem(QLayout *pl, const QString &fullFileName, const QString& s3FileName, const QString& deleteToken) { + ImgS3Uploader *uploader = new ImgS3Uploader(); + uploader->show(); + uploader->deleteResource(s3FileName, deleteToken); - // delete cached image on local dist - QFile file(fullFileName); - file.remove(); + connect(uploader, &QWidget::destroyed, this, [=](){ + // delete cached image on local dist + QFile file(fullFileName); + file.remove(); - // remove current row or refresh list - while(pl->count() > 0) - { - QLayoutItem *item = pl->takeAt(0); - delete item->widget(); - delete item; - } - m_pVBox->removeItem(pl); - delete pl; + // remove current row or refresh list + while(pl->count() > 0) + { + QLayoutItem *item = pl->takeAt(0); + delete item->widget(); + delete item; + } + m_pVBox->removeItem(pl); + delete pl; - // set "empty" message if no items left - if(m_pVBox->count() == 0) { - setEmptyMessage(); - } + // set "empty" message if no items left + if(m_pVBox->count() == 0) { + setEmptyMessage(); + } + }); } diff --git a/src/widgets/historywidget.h b/src/widgets/historywidget.h index c685a501..c80e9092 100644 --- a/src/widgets/historywidget.h +++ b/src/widgets/historywidget.h @@ -8,6 +8,7 @@ #include #include #include +#include "src/tools/imgs3/imgs3settings.h" class QLayout; class QVBoxLayout; @@ -24,10 +25,11 @@ signals: private: void loadHistory(); void addLine(const QString &, const QString &); - void removeItem(QLayout *, const QString &); + void removeItem(QLayout *, const QString &, const QString &, const QString &); void setEmptyMessage(); private: + ImgS3Settings m_s3Settings; QVBoxLayout *m_pVBox; NotificationWidget *m_notification; };