aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.h
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2020-03-20 08:32:10 +0100
committerGitHub <noreply@github.com>2020-03-20 08:32:10 +0100
commitc810c10da56fad0f5c07b2096cae73e8471d9f0e (patch)
treef473b9e7d157489200485f1f75a41de71778c3f1 /lib/connection.h
parent792dc5dcc8e548030f9246f20a39ef6febee3910 (diff)
parentab3d0263b770e30de673c63740a5c26bcbf33e58 (diff)
downloadlibquotient-c810c10da56fad0f5c07b2096cae73e8471d9f0e.tar.gz
libquotient-c810c10da56fad0f5c07b2096cae73e8471d9f0e.zip
Merge pull request #389 from quotient-im/kitsune-login-flows
Support single sign-on
Diffstat (limited to 'lib/connection.h')
-rw-r--r--lib/connection.h70
1 files changed, 65 insertions, 5 deletions
diff --git a/lib/connection.h b/lib/connection.h
index b57f0ca8..9b222ca8 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -18,9 +18,11 @@
#pragma once
+#include "ssosession.h"
#include "joinstate.h"
#include "qt_connection_util.h"
+#include "csapi/login.h"
#include "csapi/create_room.h"
#include "events/accountdataevents.h"
@@ -36,6 +38,8 @@ namespace QtOlm {
class Account;
}
+Q_DECLARE_METATYPE(Quotient::GetLoginFlowsJob::LoginFlow)
+
namespace Quotient {
Q_NAMESPACE
@@ -58,6 +62,28 @@ class SendToDeviceJob;
class SendMessageJob;
class LeaveRoomJob;
+// To simplify comparisons of LoginFlows
+
+inline bool operator==(const GetLoginFlowsJob::LoginFlow& lhs,
+ const GetLoginFlowsJob::LoginFlow& rhs)
+{
+ return lhs.type == rhs.type;
+}
+
+inline bool operator!=(const GetLoginFlowsJob::LoginFlow& lhs,
+ const GetLoginFlowsJob::LoginFlow& rhs)
+{
+ return !(lhs == rhs);
+}
+
+/// Predefined login flows
+struct LoginFlows {
+ using LoginFlow = GetLoginFlowsJob::LoginFlow;
+ static inline const LoginFlow Password { "m.login.password" };
+ static inline const LoginFlow SSO { "m.login.sso" };
+ static inline const LoginFlow Token { "m.login.token" };
+};
+
class Connection;
using room_factory_t =
@@ -117,6 +143,9 @@ class Connection : public QObject {
Q_PROPERTY(QUrl homeserver READ homeserver WRITE setHomeserver NOTIFY
homeserverChanged)
Q_PROPERTY(QString domain READ domain NOTIFY homeserverChanged)
+ Q_PROPERTY(QVector<Quotient::GetLoginFlowsJob::LoginFlow> loginFlows READ loginFlows NOTIFY loginFlowsChanged)
+ Q_PROPERTY(bool supportsSso READ supportsSso NOTIFY loginFlowsChanged)
+ Q_PROPERTY(bool supportsPasswordAuth READ supportsPasswordAuth NOTIFY loginFlowsChanged)
Q_PROPERTY(bool cacheState READ cacheState WRITE setCacheState NOTIFY
cacheStateChanged)
Q_PROPERTY(bool lazyLoading READ lazyLoading WRITE setLazyLoading NOTIFY
@@ -281,6 +310,12 @@ public:
QUrl homeserver() const;
/** Get the domain name used for ids/aliases on the server */
QString domain() const;
+ /** Get the list of supported login flows */
+ QVector<GetLoginFlowsJob::LoginFlow> loginFlows() const;
+ /** Check whether the current homeserver supports password auth */
+ bool supportsPasswordAuth() const;
+ /** Check whether the current homeserver supports SSO */
+ bool supportsSso() const;
/** Find a room by its id and a mask of applicable states */
Q_INVOKABLE Quotient::Room*
room(const QString& roomId,
@@ -421,6 +456,21 @@ public:
std::forward<JobArgTs>(jobArgs)...);
}
+ /*! Get a request URL for a job with specified type and arguments
+ *
+ * This calls JobT::makeRequestUrl() prepending the connection's homeserver
+ * to the list of arguments.
+ */
+ template <typename JobT, typename... JobArgTs>
+ QUrl getUrlForApi(JobArgTs&&... jobArgs) const
+ {
+ return JobT::makeRequestUrl(homeserver(),
+ std::forward<JobArgTs>(jobArgs)...);
+ }
+
+ Q_INVOKABLE SsoSession* prepareForSso(const QString& initialDeviceName,
+ const QString& deviceId = {});
+
/** Generate a new transaction id. Transaction id's are unique within
* a single Connection object
*/
@@ -459,11 +509,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();
@@ -609,6 +671,7 @@ signals:
void resolveError(QString error);
void homeserverChanged(QUrl baseUrl);
+ void loginFlowsChanged();
void capabilitiesLoaded();
void connected();
@@ -809,9 +872,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;