aboutsummaryrefslogtreecommitdiff
path: root/lib/csapi/registration.h
blob: 02f4ddaf15c9824b7dd1b9b6acfd0933db8da30b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
/******************************************************************************
 * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
 */

#pragma once

#include "jobs/basejob.h"

#include "converters.h"
#include "csapi/../identity/definitions/sid.h"
#include "csapi/definitions/auth_data.h"

namespace QMatrixClient {
    // Operations

    /// Register for an account on this homeserver.
    ///
    /// This API endpoint uses the `User-Interactive Authentication API`_.
    ///
    /// Register for an account on this homeserver.
    ///
    /// There are two kinds of user account:
    ///
    /// - `user` accounts. These accounts may use the full API described in this
    /// specification.
    ///
    /// - `guest` accounts. These accounts may have limited permissions and may
    /// not be supported by all servers.
    ///
    /// If registration is successful, this endpoint will issue an access token
    /// the client can use to authorize itself in subsequent requests.
    ///
    /// If the client does not supply a ``device_id``, the server must
    /// auto-generate one.
    ///
    /// The server SHOULD register an account with a User ID based on the
    /// ``username`` provided, if any. Note that the grammar of Matrix User ID
    /// localparts is restricted, so the server MUST either map the provided
    /// ``username`` onto a ``user_id`` in a logical manner, or reject
    /// ``username``\s which do not comply to the grammar, with
    /// ``M_INVALID_USERNAME``.
    ///
    /// Matrix clients MUST NOT assume that localpart of the registered
    /// ``user_id`` matches the provided ``username``.
    ///
    /// The returned access token must be associated with the ``device_id``
    /// supplied by the client or generated by the server. The server may
    /// invalidate any access token previously associated with that device. See
    /// `Relationship between access tokens and devices`_.
    class RegisterJob : public BaseJob
    {
        public:
        /*! Register for an account on this homeserver.
         * \param kind
         *   The kind of account to register. Defaults to `user`.
         * \param auth
         *   Additional authentication information for the
         *   user-interactive authentication API. Note that this
         *   information is *not* used to define how the registered user
         *   should be authenticated, but is instead used to
         *   authenticate the ``register`` call itself. It should be
         *   left empty, or omitted, unless an earlier call returned an
         *   response with status code 401.
         * \param bindEmail
         *   If true, the server binds the email used for authentication to
         *   the Matrix ID with the identity server.
         * \param username
         *   The basis for the localpart of the desired Matrix ID. If omitted,
         *   the homeserver MUST generate a Matrix ID local part.
         * \param password
         *   The desired password for the account.
         * \param deviceId
         *   ID of the client device. If this does not correspond to a
         *   known client device, a new device will be created. The server
         *   will auto-generate a device_id if this is not specified.
         * \param initialDeviceDisplayName
         *   A display name to assign to the newly-created device. Ignored
         *   if ``device_id`` corresponds to a known device.
         * \param inhibitLogin
         *   If true, an ``access_token`` and ``device_id`` should not be
         *   returned from this call, therefore preventing an automatic
         *   login. Defaults to false.
         */
        explicit RegisterJob(const QString& kind = QStringLiteral("user"),
                             const Omittable<AuthenticationData>& auth = none,
                             Omittable<bool> bindEmail = none,
                             const QString& username = {},
                             const QString& password = {},
                             const QString& deviceId = {},
                             const QString& initialDeviceDisplayName = {},
                             Omittable<bool> inhibitLogin = none);
        ~RegisterJob() override;

        // Result properties

        /// The fully-qualified Matrix user ID (MXID) that has been registered.
        ///
        /// Any user ID returned by this API must conform to the grammar given
        /// in the `Matrix specification
        /// <https://matrix.org/docs/spec/appendices.html#user-identifiers>`_.
        const QString& userId() const;
        /// An access token for the account.
        /// This access token can then be used to authorize other requests.
        /// Required if the ``inhibit_login`` option is false.
        const QString& accessToken() const;
        /// The server_name of the homeserver on which the account has
        /// been registered.
        ///
        /// **Deprecated**. Clients should extract the server_name from
        /// ``user_id`` (by splitting at the first colon) if they require
        /// it. Note also that ``homeserver`` is not spelt this way.
        const QString& homeServer() const;
        /// ID of the registered device. Will be the same as the
        /// corresponding parameter in the request, if one was specified.
        /// Required if the ``inhibit_login`` option is false.
        const QString& deviceId() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };

    /// Begins the validation process for an email to be used during
    /// registration.
    ///
    /// Proxies the Identity Service API ``validate/email/requestToken``, but
    /// first checks that the given email address is not already associated
    /// with an account on this homeserver. See the Identity Service API for
    /// further information.
    class RequestTokenToRegisterEmailJob : public BaseJob
    {
        public:
        /*! Begins the validation process for an email to be used during registration.
         * \param clientSecret
         *   A unique string generated by the client, and used to identify the
         *   validation attempt. It must be a string consisting of the
         * characters
         *   ``[0-9a-zA-Z.=_-]``. Its length must not exceed 255 characters and
         * it must not be empty. \param email The email address to validate.
         * \param sendAttempt
         *   The server will only send an email if the ``send_attempt``
         *   is a number greater than the most recent one which it has seen,
         *   scoped to that ``email`` + ``client_secret`` pair. This is to
         *   avoid repeatedly sending the same email in the case of request
         *   retries between the POSTing user and the identity server.
         *   The client should increment this value if they desire a new
         *   email (e.g. a reminder) to be sent.
         * \param idServer
         *   The hostname of the identity server to communicate with. May
         *   optionally include a port.
         * \param nextLink
         *   Optional. When the validation is completed, the identity
         *   server will redirect the user to this URL.
         */
        explicit RequestTokenToRegisterEmailJob(const QString& clientSecret,
                                                const QString& email,
                                                int sendAttempt,
                                                const QString& idServer,
                                                const QString& nextLink = {});
        ~RequestTokenToRegisterEmailJob() override;

        // Result properties

        /// An email has been sent to the specified address.
        /// Note that this may be an email containing the validation token or it
        /// may be informing the user of an error.
        const Sid& data() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };

    /// Requests a validation token be sent to the given phone number for the
    /// purpose of registering an account
    ///
    /// Proxies the Identity Service API ``validate/msisdn/requestToken``, but
    /// first checks that the given phone number is not already associated
    /// with an account on this homeserver. See the Identity Service API for
    /// further information.
    class RequestTokenToRegisterMSISDNJob : public BaseJob
    {
        public:
        /*! Requests a validation token be sent to the given phone number for the purpose of registering an account
         * \param clientSecret
         *   A unique string generated by the client, and used to identify the
         *   validation attempt. It must be a string consisting of the
         * characters
         *   ``[0-9a-zA-Z.=_-]``. Its length must not exceed 255 characters and
         * it must not be empty. \param country The two-letter uppercase ISO
         * country code that the number in
         *   ``phone_number`` should be parsed as if it were dialled from.
         * \param phoneNumber
         *   The phone number to validate.
         * \param sendAttempt
         *   The server will only send an SMS if the ``send_attempt`` is a
         *   number greater than the most recent one which it has seen,
         *   scoped to that ``country`` + ``phone_number`` + ``client_secret``
         *   triple. This is to avoid repeatedly sending the same SMS in
         *   the case of request retries between the POSTing user and the
         *   identity server. The client should increment this value if
         *   they desire a new SMS (e.g. a reminder) to be sent.
         * \param idServer
         *   The hostname of the identity server to communicate with. May
         *   optionally include a port.
         * \param nextLink
         *   Optional. When the validation is completed, the identity
         *   server will redirect the user to this URL.
         */
        explicit RequestTokenToRegisterMSISDNJob(const QString& clientSecret,
                                                 const QString& country,
                                                 const QString& phoneNumber,
                                                 int sendAttempt,
                                                 const QString& idServer,
                                                 const QString& nextLink = {});
        ~RequestTokenToRegisterMSISDNJob() override;

        // Result properties

        /// An SMS message has been sent to the specified phone number.
        /// Note that this may be an SMS message containing the validation token
        /// or it may be informing the user of an error.
        const Sid& data() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };

    /// Changes a user's password.
    ///
    /// Changes the password for an account on this homeserver.
    ///
    /// This API endpoint uses the `User-Interactive Authentication API`_.
    ///
    /// An access token should be submitted to this endpoint if the client has
    /// an active session.
    ///
    /// The homeserver may change the flows available depending on whether a
    /// valid access token is provided.
    class ChangePasswordJob : public BaseJob
    {
        public:
        /*! Changes a user's password.
         * \param newPassword
         *   The new password for the account.
         * \param auth
         *   Additional authentication information for the user-interactive
         * authentication API.
         */
        explicit ChangePasswordJob(
                const QString& newPassword,
                const Omittable<AuthenticationData>& auth = none);
    };

    /// Requests a validation token be sent to the given email address for the
    /// purpose of resetting a user's password
    ///
    /// Proxies the Identity Service API ``validate/email/requestToken``, but
    /// first checks that the given email address **is** associated with an
    /// account on this homeserver. This API should be used to request
    /// validation tokens when authenticating for the
    /// `account/password` endpoint. This API's parameters and response are
    /// identical to that of the HS API |/register/email/requestToken|_ except
    /// that `M_THREEPID_NOT_FOUND` may be returned if no account matching the
    /// given email address could be found. The server may instead send an
    /// email to the given address prompting the user to create an account.
    /// `M_THREEPID_IN_USE` may not be returned.
    ///
    /// .. |/register/email/requestToken| replace::
    /// ``/register/email/requestToken``
    ///
    /// .. _/register/email/requestToken:
    /// #post-matrix-client-r0-register-email-requesttoken
    class RequestTokenToResetPasswordEmailJob : public BaseJob
    {
        public:
        /*! Requests a validation token be sent to the given email address for the purpose of resetting a user's password
         * \param clientSecret
         *   A unique string generated by the client, and used to identify the
         *   validation attempt. It must be a string consisting of the
         * characters
         *   ``[0-9a-zA-Z.=_-]``. Its length must not exceed 255 characters and
         * it must not be empty. \param email The email address to validate.
         * \param sendAttempt
         *   The server will only send an email if the ``send_attempt``
         *   is a number greater than the most recent one which it has seen,
         *   scoped to that ``email`` + ``client_secret`` pair. This is to
         *   avoid repeatedly sending the same email in the case of request
         *   retries between the POSTing user and the identity server.
         *   The client should increment this value if they desire a new
         *   email (e.g. a reminder) to be sent.
         * \param idServer
         *   The hostname of the identity server to communicate with. May
         *   optionally include a port.
         * \param nextLink
         *   Optional. When the validation is completed, the identity
         *   server will redirect the user to this URL.
         */
        explicit RequestTokenToResetPasswordEmailJob(
                const QString& clientSecret, const QString& email,
                int sendAttempt, const QString& idServer,
                const QString& nextLink = {});
        ~RequestTokenToResetPasswordEmailJob() override;

        // Result properties

        /// An email was sent to the given address.
        const Sid& data() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };

    /// Requests a validation token be sent to the given phone number for the
    /// purpose of resetting a user's password.
    ///
    /// Proxies the Identity Service API ``validate/msisdn/requestToken``, but
    /// first checks that the given phone number **is** associated with an
    /// account on this homeserver. This API should be used to request
    /// validation tokens when authenticating for the
    /// `account/password` endpoint. This API's parameters and response are
    /// identical to that of the HS API |/register/msisdn/requestToken|_ except
    /// that `M_THREEPID_NOT_FOUND` may be returned if no account matching the
    /// given phone number could be found. The server may instead send an
    /// SMS message to the given address prompting the user to create an
    /// account. `M_THREEPID_IN_USE` may not be returned.
    ///
    /// .. |/register/msisdn/requestToken| replace::
    /// ``/register/msisdn/requestToken``
    ///
    /// .. _/register/msisdn/requestToken:
    /// #post-matrix-client-r0-register-email-requesttoken
    class RequestTokenToResetPasswordMSISDNJob : public BaseJob
    {
        public:
        /*! Requests a validation token be sent to the given phone number for the purpose of resetting a user's password.
         * \param clientSecret
         *   A unique string generated by the client, and used to identify the
         *   validation attempt. It must be a string consisting of the
         * characters
         *   ``[0-9a-zA-Z.=_-]``. Its length must not exceed 255 characters and
         * it must not be empty. \param country The two-letter uppercase ISO
         * country code that the number in
         *   ``phone_number`` should be parsed as if it were dialled from.
         * \param phoneNumber
         *   The phone number to validate.
         * \param sendAttempt
         *   The server will only send an SMS if the ``send_attempt`` is a
         *   number greater than the most recent one which it has seen,
         *   scoped to that ``country`` + ``phone_number`` + ``client_secret``
         *   triple. This is to avoid repeatedly sending the same SMS in
         *   the case of request retries between the POSTing user and the
         *   identity server. The client should increment this value if
         *   they desire a new SMS (e.g. a reminder) to be sent.
         * \param idServer
         *   The hostname of the identity server to communicate with. May
         *   optionally include a port.
         * \param nextLink
         *   Optional. When the validation is completed, the identity
         *   server will redirect the user to this URL.
         */
        explicit RequestTokenToResetPasswordMSISDNJob(
                const QString& clientSecret, const QString& country,
                const QString& phoneNumber, int sendAttempt,
                const QString& idServer, const QString& nextLink = {});
        ~RequestTokenToResetPasswordMSISDNJob() override;

        // Result properties

        /// An SMS message was sent to the given phone number.
        const Sid& data() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };

    /// Deactivate a user's account.
    ///
    /// Deactivate the user's account, removing all ability for the user to
    /// login again.
    ///
    /// This API endpoint uses the `User-Interactive Authentication API`_.
    ///
    /// An access token should be submitted to this endpoint if the client has
    /// an active session.
    ///
    /// The homeserver may change the flows available depending on whether a
    /// valid access token is provided.
    class DeactivateAccountJob : public BaseJob
    {
        public:
        /*! Deactivate a user's account.
         * \param auth
         *   Additional authentication information for the user-interactive
         * authentication API.
         */
        explicit DeactivateAccountJob(
                const Omittable<AuthenticationData>& auth = none);
    };

    /// Checks to see if a username is available on the server.
    ///
    /// Checks to see if a username is available, and valid, for the server.
    ///
    /// The server should check to ensure that, at the time of the request, the
    /// username requested is available for use. This includes verifying that an
    /// application service has not claimed the username and that the username
    /// fits the server's desired requirements (for example, a server could
    /// dictate that it does not permit usernames with underscores).
    ///
    /// Matrix clients may wish to use this API prior to attempting
    /// registration, however the clients must also be aware that using this API
    /// does not normally reserve the username. This can mean that the username
    /// becomes unavailable between checking its availability and attempting to
    /// register it.
    class CheckUsernameAvailabilityJob : public BaseJob
    {
        public:
        /*! Checks to see if a username is available on the server.
         * \param username
         *   The username to check the availability of.
         */
        explicit CheckUsernameAvailabilityJob(const QString& username);

        /*! Construct a URL without creating a full-fledged job object
         *
         * This function can be used when a URL for
         * CheckUsernameAvailabilityJob is necessary but the job
         * itself isn't.
         */
        static QUrl makeRequestUrl(QUrl baseUrl, const QString& username);

        ~CheckUsernameAvailabilityJob() override;

        // Result properties

        /// A flag to indicate that the username is available. This should
        /// always be ``true`` when the server replies with 200 OK.
        Omittable<bool> available() const;

        protected:
        Status parseJson(const QJsonDocument& data) override;

        private:
        class Private;
        QScopedPointer<Private> d;
    };
} // namespace QMatrixClient