Remove screenshot from s3 bucket
This commit is contained in:
@@ -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 \
|
||||
|
||||
35
src/tools/imgs3/imgs3settings.cpp
Normal file
35
src/tools/imgs3/imgs3settings.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include "imgs3settings.h"
|
||||
#include "src/utils/configenterprise.h"
|
||||
#include <QSettings>
|
||||
|
||||
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;
|
||||
}
|
||||
27
src/tools/imgs3/imgs3settings.h
Normal file
27
src/tools/imgs3/imgs3settings.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef IMGS3SETTINGS_H
|
||||
#define IMGS3SETTINGS_H
|
||||
|
||||
#define S3_API_IMG_PATH "v2/image/"
|
||||
|
||||
|
||||
#include <QString>
|
||||
|
||||
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
|
||||
@@ -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<QUrl> { 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() {
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define S3_API_IMG_PATH "v2/image/"
|
||||
|
||||
#include "imgs3settings.h"
|
||||
#include <QWidget>
|
||||
#include <QUrl>
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QPixmap>
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
#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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user