Skip to content

Commit 0f774c4

Browse files
committed
chore: version 7.11.2
2 parents 13494dc + 852b367 commit 0f774c4

17 files changed

+321
-38
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
title: "Grabber 7.11.2 released"
3+
date: 2023-07-23 21:45 +0200
4+
categories: release
5+
---
6+
7+
8+
Grabber 7.11.2 has been released.
9+
10+
The list of changes and download links can be found on Github:
11+
<https://github.com/Bionus/imgbrd-grabber/releases/tag/v7.11.2>

scripts/windows-setup/setup.iss

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#endif
2323

2424
#ifndef MyAppVersion
25-
# define MyAppVersion "7.11.1"
25+
# define MyAppVersion "7.11.2"
2626
#endif
2727

2828
#ifndef QtApngDll

src/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ if(TRACE)
3737
endif()
3838

3939
if((NOT DEFINED VERSION) OR ((DEFINED NIGHTLY) AND (NIGHTLY MATCHES "1")))
40-
set(VERSION "7.11.1")
40+
set(VERSION "7.11.2")
4141
else()
4242
string(REGEX REPLACE "^v" "" VERSION "${VERSION}")
4343
endif()

src/dist/linux/org.bionus.Grabber.metainfo.xml

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<url type="contribute">https://github.com/Bionus/imgbrd-grabber/blob/master/CONTRIBUTING.md</url>
4444

4545
<releases>
46+
<release version="7.11.2" date="2023-07-23" />
4647
<release version="7.11.1" date="2023-06-25" />
4748
<release version="7.11.0" date="2023-06-05" />
4849
<release version="7.10.1" date="2023-01-07" />

src/gui/src/viewer/viewer-window.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,8 @@ ViewerWindow::ViewerWindow(QList<QSharedPointer<Image>> images, const QSharedPoi
175175
setStyleSheet("#ViewerWindow { background-color:" + bg + "; }");
176176
}
177177

178-
m_resizeTimer = new QTimer(this);
179-
connect(m_resizeTimer, SIGNAL(timeout()), this, SLOT(update()));
180-
m_resizeTimer->setSingleShot(true);
178+
connect(&m_resizeTimer, SIGNAL(timeout()), this, SLOT(update()));
179+
m_resizeTimer.setSingleShot(true);
181180

182181
load(image);
183182
}
@@ -1201,11 +1200,11 @@ void ViewerWindow::toggleSlideshow()
12011200

12021201
void ViewerWindow::resizeEvent(QResizeEvent *e)
12031202
{
1204-
if (!m_resizeTimer->isActive()) {
1203+
if (!m_resizeTimer.isActive()) {
12051204
m_timeout = qMin(500, qMax(50, (m_displayImage.width() * m_displayImage.height()) / 100000));
12061205
}
1207-
m_resizeTimer->stop();
1208-
m_resizeTimer->start(m_timeout);
1206+
m_resizeTimer.stop();
1207+
m_resizeTimer.start(m_timeout);
12091208
update(true);
12101209

12111210
QWidget::resizeEvent(e);

src/gui/src/viewer/viewer-window.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ class ViewerWindow : public QWidget
139139
bool m_pendingClose;
140140
bool m_tooBig, m_loadedImage, m_loadedDetails;
141141
QAffiche *m_labelTagsTop, *m_labelTagsLeft;
142-
QTimer *m_resizeTimer;
142+
QTimer m_resizeTimer;
143143
QElapsedTimer m_imageTime;
144144
QString m_link;
145145
bool m_finished;

src/lib/src/analytics.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "analytics.h"
2+
#include <QCoreApplication>
23

34
class QString;
45
class QVariant;
@@ -62,6 +63,8 @@ void Analytics::sendScreenView(const QString& screenName, const QVariantMap& cus
6263
QVariantMap eventParams(customValues);
6364
eventParams["firebase_screen"] = screenName;
6465
eventParams["firebase_screen_class"] = screenName;
66+
eventParams["app_name"] = qApp->applicationName();
67+
eventParams["app_version"] = qApp->applicationVersion();
6568
m_ga4.sendEvent("screen_view", eventParams);
6669
}
6770

src/lib/src/downloader/image-downloader.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void ImageDownloader::setSize(Image::Size size)
6060
{
6161
if (size == Image::Size::Unknown) {
6262
const bool getOriginals = m_profile->getSettings()->value("Save/downloadoriginals", true).toBool();
63-
const bool hasSample = m_image->url(Image::Size::Sample).isEmpty();
63+
const bool hasSample = !m_image->url(Image::Size::Sample).isEmpty();
6464
if (getOriginals || !hasSample) {
6565
m_size = Image::Size::Full;
6666
} else {

src/lib/src/login/oauth2-login.cpp

+33-13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ OAuth2Login::OAuth2Login(OAuth2Auth *auth, Site *site, NetworkManager *manager,
2727
{
2828
m_accessToken = m_settings->value("auth/accessToken").toString();
2929
m_refreshToken = m_settings->value("auth/refreshToken").toString();
30+
m_expires = m_settings->value("auth/accessTokenExpiration").toDateTime();
3031
}
3132

3233
bool OAuth2Login::isTestable() const
@@ -200,8 +201,10 @@ void OAuth2Login::loginAuthorizationCode()
200201

201202
m_accessToken = flow->token();
202203
m_refreshToken = flow->refreshToken();
204+
m_expires = flow->expirationAt();
203205
m_settings->setValue("auth/accessToken", m_accessToken);
204206
m_settings->setValue("auth/refreshToken", m_refreshToken);
207+
m_settings->setValue("auth/accessTokenExpiration", m_expires);
205208

206209
emit loggedIn(Result::Success);
207210

@@ -300,19 +303,30 @@ void OAuth2Login::basicRefresh()
300303

301304
void OAuth2Login::refresh(bool login)
302305
{
303-
log(QStringLiteral("[%1] Refreshing OAuth2 token...").arg(m_site->url()), Logger::Info);
306+
// Don't try to refresh while a refresh is already in progress
307+
if (m_refreshing) {
308+
if (login) {
309+
m_refreshForLogin = true;
310+
}
311+
return;
312+
}
304313

305-
const QString consumerKey = m_settings->value("auth/consumerKey").toString();
306-
const QString consumerSecret = m_settings->value("auth/consumerSecret").toString();
314+
log(QStringLiteral("[%1] Refreshing OAuth2 token...").arg(m_site->url()), Logger::Info);
307315

316+
// Without a refresh token, there's nothing to do
308317
if (m_refreshToken.isEmpty()) {
309318
log(QStringLiteral("[%1] Cannot refresh OAuth2 token without a refresh token").arg(m_site->url()), Logger::Warning);
310319
if (login) {
311320
emit loggedIn(Result::Failure);
312321
}
322+
m_refreshing = false;
313323
return;
314324
}
315325

326+
// Set the refresh status and block other refresh requests until this one is completed
327+
m_refreshing = true;
328+
m_refreshForLogin = login;
329+
316330
QNetworkRequest request(m_site->fixUrl(m_auth->tokenUrl()));
317331
m_site->setRequestHeaders(request);
318332

@@ -326,6 +340,8 @@ void OAuth2Login::refresh(bool login)
326340
data = jsonDoc.toJson();
327341
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
328342
} else {
343+
const QString consumerKey = m_settings->value("auth/consumerKey").toString();
344+
const QString consumerSecret = m_settings->value("auth/consumerSecret").toString();
329345
const QList<QStrP> body {
330346
{ "grant_type", "refresh_token" },
331347
{ "client_id", consumerKey },
@@ -344,16 +360,16 @@ void OAuth2Login::refresh(bool login)
344360

345361
// Post request and wait for a reply
346362
m_refreshReply = m_manager->post(request, data);
347-
if (login) {
348-
connect(m_refreshReply, &NetworkReply::finished, this, &OAuth2Login::refreshLoginFinished);
349-
} else {
350-
connect(m_refreshReply, &NetworkReply::finished, this, &OAuth2Login::refreshFinished);
351-
}
363+
connect(m_refreshReply, &NetworkReply::finished, this, &OAuth2Login::refreshFinished);
352364
}
353365

354-
void OAuth2Login::refreshLoginFinished()
366+
void OAuth2Login::refreshFinished()
355367
{
356368
const bool ok = readResponse(m_refreshReply);
369+
m_refreshing = false;
370+
if (!m_refreshForLogin) {
371+
return;
372+
}
357373
if (!ok) {
358374
if (m_auth->authType() == "refresh_token") {
359375
log(QStringLiteral("[%1] Refresh failed").arg(m_site->url()), Logger::Warning);
@@ -366,15 +382,13 @@ void OAuth2Login::refreshLoginFinished()
366382
m_settings->remove("auth/accessToken");
367383
m_refreshToken.clear();
368384
m_settings->remove("auth/refreshToken");
385+
m_expires = QDateTime();
386+
m_settings->remove("auth/accessTokenExpiration");
369387
login();
370388
} else {
371389
emit loggedIn(Result::Success);
372390
}
373391
}
374-
void OAuth2Login::refreshFinished()
375-
{
376-
readResponse(m_refreshReply);
377-
}
378392

379393
bool OAuth2Login::readResponse(NetworkReply *reply)
380394
{
@@ -441,6 +455,7 @@ bool OAuth2Login::readResponse(NetworkReply *reply)
441455
const int expiresSecond = QDateTime::currentDateTime().secsTo(m_expires);
442456
QTimer::singleShot((expiresSecond / 2) * 1000, this, SIGNAL(basicRefresh()));
443457
log(QStringLiteral("[%1] Token will expire at '%2'").arg(m_site->url(), m_expires.toString("yyyy-MM-dd HH:mm:ss")), Logger::Debug);
458+
m_settings->setValue("auth/accessTokenExpiration", m_expires);
444459
}
445460
}
446461

@@ -449,6 +464,11 @@ bool OAuth2Login::readResponse(NetworkReply *reply)
449464

450465
void OAuth2Login::complementRequest(QNetworkRequest *request) const
451466
{
467+
// Trigger a token refresh in the background if the token is expired
468+
if (!m_refreshToken.isEmpty() && (!m_expires.isValid() || m_expires < QDateTime::currentDateTime())) {
469+
const_cast<OAuth2Login*>(this)->refresh(false);
470+
}
471+
452472
if (!m_accessToken.isEmpty()) {
453473
request->setRawHeader("Authorization", "Bearer " + m_accessToken.toUtf8());
454474
}

src/lib/src/login/oauth2-login.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class OAuth2Login : public Login
3131

3232
protected slots:
3333
void loginFinished();
34-
void refreshLoginFinished();
3534
void refreshFinished();
3635
void basicRefresh();
3736

@@ -54,6 +53,8 @@ class OAuth2Login : public Login
5453
QString m_accessToken;
5554
QString m_refreshToken;
5655
QDateTime m_expires;
56+
bool m_refreshing = false;
57+
bool m_refreshForLogin = false;
5758
};
5859

5960
#endif // OAUTH2_LOGIN_H

0 commit comments

Comments
 (0)