aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/connection.cpp')
-rw-r--r--lib/connection.cpp75
1 files changed, 48 insertions, 27 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 52a693f7..6ebe05dc 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -33,7 +33,9 @@
#include "csapi/receipts.h"
#include "csapi/room_send.h"
#include "csapi/to_device.h"
+#include "csapi/versions.h"
#include "csapi/voip.h"
+#include "csapi/wellknown.h"
#include "events/directchatevent.h"
#include "events/eventloader.h"
@@ -176,36 +178,50 @@ void Connection::resolveServer(const QString& mxid)
}
setHomeserver(maybeBaseUrl);
- emit resolved();
- return;
- // FIXME, #178: The below code is incorrect and is no more executed. The
- // correct server resolution should be done from .well-known/matrix/client
auto domain = maybeBaseUrl.host();
qCDebug(MAIN) << "Finding the server" << domain;
- // Check if the Matrix server has a dedicated service record.
- auto* dns = new QDnsLookup();
- dns->setType(QDnsLookup::SRV);
- dns->setName("_matrix._tcp." + domain);
-
- connect(dns, &QDnsLookup::finished, [this, dns, maybeBaseUrl]() {
- QUrl baseUrl { maybeBaseUrl };
- if (dns->error() == QDnsLookup::NoError
- && dns->serviceRecords().isEmpty()) {
- auto record = dns->serviceRecords().front();
- baseUrl.setHost(record.target());
- baseUrl.setPort(record.port());
- qCDebug(MAIN) << "SRV record for" << maybeBaseUrl.host() << "is"
- << baseUrl.authority();
- } else {
- qCDebug(MAIN) << baseUrl.host() << "doesn't have SRV record"
- << dns->name() << "- using the hostname as is";
- }
- setHomeserver(baseUrl);
- emit resolved();
- dns->deleteLater();
- });
- dns->lookup();
+
+ 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.toString();
+ 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();
+ } else {
+ qCDebug(MAIN) << "homeserver url invalid";
+ emit resolveError(tr("homeserver url invalid"));
+ }
+ });
+ });
}
void Connection::connectToServer(const QString& user, const QString& password,
@@ -921,6 +937,11 @@ QString Connection::deviceId() const { return d->data->deviceId(); }
QByteArray Connection::accessToken() const { return d->data->accessToken(); }
+QtOlm::Account* Connection::olmAccount() const
+{
+ return d->encryptionManager->account();
+}
+
SyncJob* Connection::syncJob() const { return d->syncJob; }
int Connection::millisToReconnect() const