Hello community,
here is the log from the commit of package libqmatrixclient for
openSUSE:Factory checked in at 2020-03-31 17:17:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libqmatrixclient (Old)
and /work/SRC/openSUSE:Factory/.libqmatrixclient.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libqmatrixclient"
Tue Mar 31 17:17:51 2020 rev:7 rq:790121 version:0.5.3.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/libqmatrixclient/libqmatrixclient.changes
2020-03-30 23:03:52.388192573 +0200
+++
/work/SRC/openSUSE:Factory/.libqmatrixclient.new.3160/libqmatrixclient.changes
2020-03-31 17:17:54.523729085 +0200
@@ -1,0 +2,12 @@
+Tue Mar 31 11:29:21 UTC 2020 - [email protected]
+
+- Update to 0.5.3.1
+ One more "sustaining" release that fixes a long-standing problem
+ with job objects lifetime lasting beyond their connection
+ lifetime, leading to crashes on connection removal (#397/#398).
+ This problem became very apparent with introduction of SSO in
+ Quaternion, where connection objects are removed as soon as the
+ login dialog is cancelled; this release is aimed solely at fixing
+ that.
+
+-------------------------------------------------------------------
Old:
----
libqmatrixclient-0.5.3.tar.gz
New:
----
libqmatrixclient-0.5.3.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libqmatrixclient.spec ++++++
--- /var/tmp/diff_new_pack.XojZhb/_old 2020-03-31 17:17:55.599729768 +0200
+++ /var/tmp/diff_new_pack.XojZhb/_new 2020-03-31 17:17:55.599729768 +0200
@@ -22,7 +22,7 @@
%define sname libQuotient
Name: libqmatrixclient
-Version: 0.5.3
+Version: 0.5.3.1
Release: 0
Summary: Library for Qt Matrix Clients
License: LGPL-2.1-only
++++++ libqmatrixclient-0.5.3.tar.gz -> libqmatrixclient-0.5.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/libQuotient-0.5.3/CMakeLists.txt
new/libQuotient-0.5.3.1/CMakeLists.txt
--- old/libQuotient-0.5.3/CMakeLists.txt 2020-03-27 18:07:13.000000000
+0100
+++ new/libQuotient-0.5.3.1/CMakeLists.txt 2020-03-31 07:46:55.000000000
+0200
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.1)
set(API_VERSION "0.5.1") # Normally it should just include major.minor
-project(qmatrixclient VERSION "0.5.3" LANGUAGES CXX)
+project(qmatrixclient VERSION "0.5.3.1" LANGUAGES CXX)
option(QMATRIXCLIENT_INSTALL_EXAMPLE "install qmc-example application" ON)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/libQuotient-0.5.3/lib/connection.cpp
new/libQuotient-0.5.3.1/lib/connection.cpp
--- old/libQuotient-0.5.3/lib/connection.cpp 2020-03-27 18:07:13.000000000
+0100
+++ new/libQuotient-0.5.3.1/lib/connection.cpp 2020-03-31 07:46:55.000000000
+0200
@@ -175,52 +175,60 @@
maybeBaseUrl.setScheme("https"); // Instead of the Qt-default "http"
if (!match.hasMatch() || !maybeBaseUrl.isValid())
{
- emit resolveError(
- tr("%1 is not a valid homeserver address")
- .arg(maybeBaseUrl.toString()));
+ emit resolveError(tr("%1 is not a valid homeserver address")
+ .arg(maybeBaseUrl.toString()));
return;
}
- setHomeserver(maybeBaseUrl);
-
auto domain = maybeBaseUrl.host();
qCDebug(MAIN) << "Finding the server" << domain;
+ d->data->setBaseUrl(maybeBaseUrl); // Just enough to check .well-known file
auto getWellKnownJob = callApi<GetWellknownJob>();
- connect(getWellKnownJob, &BaseJob::finished, [this, getWellKnownJob,
maybeBaseUrl] {
- if (getWellKnownJob->status() == BaseJob::NotFoundError) {
- qCDebug(MAIN) << "No .well-known file, IGNORE";
- } else if (getWellKnownJob->status() != BaseJob::Success) {
- qCDebug(MAIN) << "Fetching .well-known file failed, FAIL_PROMPT";
- emit resolveError(tr("Fetching .well-known file failed"));
- return;
- } else if (getWellKnownJob->data().homeserver.baseUrl.isEmpty()) {
- qCDebug(MAIN) << "base_url not provided, FAIL_PROMPT";
- emit resolveError(tr("base_url not provided"));
- return;
- } else if
(!QUrl(getWellKnownJob->data().homeserver.baseUrl).isValid()) {
- qCDebug(MAIN) << "base_url invalid, FAIL_ERROR";
- emit resolveError(tr("base_url invalid"));
- return;
- } else {
- QUrl baseUrl(getWellKnownJob->data().homeserver.baseUrl);
-
- qCDebug(MAIN) << ".well-known for" << maybeBaseUrl.host() << "is"
<< baseUrl.authority();
- setHomeserver(baseUrl);
- }
-
- auto getVersionsJob = callApi<GetVersionsJob>();
-
- connect(getVersionsJob, &BaseJob::finished, [this, getVersionsJob] {
- if (getVersionsJob->status() == BaseJob::Success) {
- qCDebug(MAIN) << "homeserver url is valid";
- emit resolved();
+ // This is a workaround for 0.5.x; due to the way Quaternion's login dialog
+ // operates, Connection can disappear any moment during server resolution.
+ // Quotient 0.6 will reparent all jobs to enforce lifetimes. See also #398.
+ getWellKnownJob->setParent(this);
+ connect(getWellKnownJob, &BaseJob::finished, this,
+ [this, getWellKnownJob, maybeBaseUrl] {
+ if (getWellKnownJob->status() != BaseJob::NotFoundError) {
+ if (getWellKnownJob->status() != BaseJob::Success) {
+ qCWarning(MAIN)
+ << "Fetching .well-known file failed, FAIL_PROMPT";
+ emit resolveError(tr("Failed resolving the homeserver"));
+ return;
+ }
+ QUrl baseUrl { getWellKnownJob->data().homeserver.baseUrl };
+ if (baseUrl.isEmpty()) {
+ qCWarning(MAIN) << "base_url not provided, FAIL_PROMPT";
+ emit resolveError(
+ tr("The homeserver base URL is not provided"));
+ return;
+ }
+ if (!baseUrl.isValid()) {
+ qCWarning(MAIN) << "base_url invalid, FAIL_ERROR";
+ emit resolveError(tr("The homeserver base URL is
invalid"));
+ return;
+ }
+ qCInfo(MAIN) << ".well-known URL for" << maybeBaseUrl.host()
+ << "is" << baseUrl.authority();
+ setHomeserver(baseUrl);
} else {
- qCDebug(MAIN) << "homeserver url invalid";
- emit resolveError(tr("homeserver url invalid"));
+ qCInfo(MAIN) << "No .well-known file, using" << maybeBaseUrl
+ << "for base URL";
+ setHomeserver(maybeBaseUrl);
}
+
+ auto getVersionsJob = callApi<GetVersionsJob>();
+ getVersionsJob->setParent(this); // Same workaround as above
+ connect(getVersionsJob, &BaseJob::success, this,
+ &Connection::resolved);
+ connect(getVersionsJob, &BaseJob::failure, this, [this] {
+ qCWarning(MAIN) << "Homeserver base URL invalid";
+ emit resolveError(tr("The homeserver base URL "
+ "doesn't seem to work"));
+ });
});
- });
}
inline UserIdentifier makeUserIdentifier(const QString& id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/libQuotient-0.5.3/lib/jobs/basejob.cpp
new/libQuotient-0.5.3.1/lib/jobs/basejob.cpp
--- old/libQuotient-0.5.3/lib/jobs/basejob.cpp 2020-03-27 18:07:13.000000000
+0100
+++ new/libQuotient-0.5.3.1/lib/jobs/basejob.cpp 2020-03-31
07:46:55.000000000 +0200
@@ -104,6 +104,7 @@
BaseJob::~BaseJob()
{
stop();
+ d->retryTimer.stop(); // See #398
qCDebug(d->logCat) << this << "destroyed";
}
@@ -210,6 +211,7 @@
// some sources claim that there are issues with QT 5.8
req.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true);
#endif
+ Q_ASSERT(req.url().isValid());
for (auto it = requestHeaders.cbegin(); it != requestHeaders.cend(); ++it)
req.setRawHeader(it.key(), it.value());
switch( verb )
@@ -240,16 +242,23 @@
void BaseJob::start(const ConnectionData* connData, bool inBackground)
{
- d->connection = connData;
- d->retryTimer.setSingleShot(true);
- connect (&d->retryTimer, &QTimer::timeout,
- this, [this,inBackground] { sendRequest(inBackground); });
-
- beforeStart(connData);
- if (status().good())
- sendRequest(inBackground);
- if (status().good())
- afterStart(connData, d->reply.data());
+ if (connData && connData->baseUrl().isValid()) {
+ d->connection = connData;
+ d->retryTimer.setSingleShot(true);
+ connect(&d->retryTimer, &QTimer::timeout, this,
+ [this, inBackground] { sendRequest(inBackground); });
+
+ beforeStart(connData);
+ if (status().good())
+ sendRequest(inBackground);
+ if (status().good())
+ afterStart(connData, d->reply.data());
+ } else {
+ qCCritical(d->logCat)
+ << "Developers, ensure the Connection is valid before using it";
+ Q_ASSERT(false);
+ setStatus(IncorrectRequestError, tr("Invalid server connection"));
+ }
if (!status().good())
QTimer::singleShot(0, this, &BaseJob::finishJob);
}
@@ -641,6 +650,8 @@
void BaseJob::abandon()
{
beforeAbandon(d->reply ? d->reply.data() : nullptr);
+ d->timer.stop();
+ d->retryTimer.stop(); // In case abandon() was called between retries
setStatus(Abandoned);
if (d->reply)
d->reply->disconnect(this);