aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/connection.cpp88
-rw-r--r--lib/connection.h19
2 files changed, 69 insertions, 38 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index b0ab5bfe..4b4d371a 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -125,8 +125,10 @@ public:
!= "json";
bool lazyLoading = false;
- void connectWithToken(const QString& userId, const QString& accessToken,
- const QString& deviceId);
+ template <typename... LoginArgTs>
+ void loginToServer(LoginArgTs&&... loginArgs);
+ void assumeIdentity(const QString& userId, const QString& accessToken,
+ const QString& deviceId);
void removeRoom(const QString& roomId);
template <typename EventT>
@@ -296,44 +298,44 @@ void Connection::resolveServer(const QString& mxid)
});
}
-void Connection::connectToServer(const QString& user, const QString& password,
+inline UserIdentifier makeUserIdentifier(const QString& id)
+{
+ return { QStringLiteral("m.id.user"), { { QStringLiteral("user"), id } } };
+}
+
+inline UserIdentifier make3rdPartyIdentifier(const QString& medium,
+ const QString& address)
+{
+ return { QStringLiteral("m.id.thirdparty"),
+ { { QStringLiteral("medium"), medium },
+ { QStringLiteral("address"), address } } };
+}
+
+void Connection::connectToServer(const QString& userId, const QString& password,
const QString& initialDeviceName,
const QString& deviceId)
{
- checkAndConnect(user, [=] {
- doConnectToServer(user, password, initialDeviceName, deviceId);
+ checkAndConnect(userId, [=] {
+ d->loginToServer(LoginFlows::Password.type, makeUserIdentifier(userId),
+ password, /*token*/ "", deviceId, initialDeviceName);
});
}
-void Connection::doConnectToServer(const QString& user, const QString& password,
- const QString& initialDeviceName,
- const QString& deviceId)
+
+void Connection::loginWithToken(const QByteArray& loginToken,
+ const QString& initialDeviceName,
+ const QString& deviceId)
{
- auto loginJob =
- callApi<LoginJob>(QStringLiteral("m.login.password"),
- UserIdentifier { QStringLiteral("m.id.user"),
- { { QStringLiteral("user"), user } } },
- password, /*token*/ "", deviceId, initialDeviceName);
- connect(loginJob, &BaseJob::success, this, [this, loginJob] {
- d->connectWithToken(loginJob->userId(), loginJob->accessToken(),
- loginJob->deviceId());
-#ifndef Quotient_E2EE_ENABLED
- qCWarning(E2EE) << "End-to-end encryption (E2EE) support is turned off.";
-#else // Quotient_E2EE_ENABLED
- d->encryptionManager->uploadIdentityKeys(this);
- d->encryptionManager->uploadOneTimeKeys(this);
-#endif // Quotient_E2EE_ENABLED
- });
- connect(loginJob, &BaseJob::failure, this, [this, loginJob] {
- emit loginError(loginJob->errorString(), loginJob->rawDataSample());
- });
+ d->loginToServer(LoginFlows::Token.type,
+ makeUserIdentifier(/*user is encoded in loginToken*/ {}),
+ /*password*/ "", loginToken, deviceId, initialDeviceName);
}
-void Connection::connectWithToken(const QString& userId,
- const QString& accessToken,
- const QString& deviceId)
+void Connection::assumeIdentity(const QString& userId,
+ const QString& accessToken,
+ const QString& deviceId)
{
checkAndConnect(userId,
- [=] { d->connectWithToken(userId, accessToken, deviceId); });
+ [=] { d->assumeIdentity(userId, accessToken, deviceId); });
}
void Connection::reloadCapabilities()
@@ -366,9 +368,29 @@ bool Connection::loadingCapabilities() const
return !d->capabilities.roomVersions;
}
-void Connection::Private::connectWithToken(const QString& userId,
- const QString& accessToken,
- const QString& deviceId)
+template <typename... LoginArgTs>
+void Connection::Private::loginToServer(LoginArgTs&&... loginArgs)
+{
+ auto loginJob =
+ q->callApi<LoginJob>(std::forward<LoginArgTs>(loginArgs)...);
+ connect(loginJob, &BaseJob::success, q, [this, loginJob] {
+ assumeIdentity(loginJob->userId(), loginJob->accessToken(),
+ loginJob->deviceId());
+#ifndef Quotient_E2EE_ENABLED
+ qCWarning(E2EE) << "End-to-end encryption (E2EE) support is turned off.";
+#else // Quotient_E2EE_ENABLED
+ encryptionManager->uploadIdentityKeys(this);
+ encryptionManager->uploadOneTimeKeys(this);
+#endif // Quotient_E2EE_ENABLED
+ });
+ connect(loginJob, &BaseJob::failure, q, [this, loginJob] {
+ emit q->loginError(loginJob->errorString(), loginJob->rawDataSample());
+ });
+}
+
+void Connection::Private::assumeIdentity(const QString& userId,
+ const QString& accessToken,
+ const QString& deviceId)
{
data->setUserId(userId);
q->user(); // Creates a User object for the local user
diff --git a/lib/connection.h b/lib/connection.h
index 9d89ca43..8f2abd0f 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -505,11 +505,23 @@ public slots:
/** Determine and set the homeserver from MXID */
void resolveServer(const QString& mxid);
- void connectToServer(const QString& user, const QString& password,
+ void connectToServer(const QString& userId, const QString& password,
const QString& initialDeviceName,
const QString& deviceId = {});
+ void loginWithToken(const QByteArray& loginToken,
+ const QString& initialDeviceName,
+ const QString& deviceId = {});
+ void assumeIdentity(const QString& userId, const QString& accessToken,
+ const QString& deviceId);
+ /*! @deprecated
+ * Use assumeIdentity() if you have an access token or
+ * loginWithToken() if you have a login token.
+ */
void connectWithToken(const QString& userId, const QString& accessToken,
- const QString& deviceId);
+ const QString& deviceId)
+ {
+ assumeIdentity(userId, accessToken, deviceId);
+ }
/// Explicitly request capabilities from the server
void reloadCapabilities();
@@ -856,9 +868,6 @@ private:
* @param connectFn - a function to execute once the HS URL is good
*/
void checkAndConnect(const QString& userId, std::function<void()> connectFn);
- void doConnectToServer(const QString& user, const QString& password,
- const QString& initialDeviceName,
- const QString& deviceId = {});
static room_factory_t _roomFactory;
static user_factory_t _userFactory;