Line data Source code
1 : /// Experimental login method using User Interactive Authentication
2 : library;
3 :
4 : import 'dart:convert';
5 :
6 : import 'package:http/http.dart' hide Client;
7 :
8 : import 'package:matrix/matrix.dart';
9 :
10 : extension UiaLogin on Client {
11 : /// Implementation of MSC2835:
12 : /// https://github.com/Sorunome/matrix-doc/blob/soru/uia-on-login/proposals/2835-uia-on-login.md
13 : /// Set `pathVersion` to `r0` if you need to use the previous
14 : /// version of the login endpoint.
15 0 : Future<LoginResponse> uiaLogin(
16 : String type, {
17 : String? address,
18 : String? deviceId,
19 : AuthenticationIdentifier? identifier,
20 : String? initialDeviceDisplayName,
21 : String? medium,
22 : String? password,
23 : String? token,
24 : String? user,
25 : AuthenticationData? auth,
26 : String pathVersion = 'v3',
27 : bool? refreshToken,
28 : }) async {
29 0 : final requestUri = Uri(path: '_matrix/client/$pathVersion/login');
30 0 : final request = Request('POST', baseUri!.resolveUri(requestUri));
31 0 : request.headers['content-type'] = 'application/json';
32 0 : request.bodyBytes = utf8.encode(
33 0 : jsonEncode({
34 0 : if (address != null) 'address': address,
35 0 : if (deviceId != null) 'device_id': deviceId,
36 0 : if (identifier != null) 'identifier': identifier.toJson(),
37 : if (initialDeviceDisplayName != null)
38 0 : 'initial_device_display_name': initialDeviceDisplayName,
39 0 : if (medium != null) 'medium': medium,
40 0 : if (password != null) 'password': password,
41 0 : if (token != null) 'token': token,
42 0 : 'type': type,
43 0 : if (user != null) 'user': user,
44 0 : if (auth != null) 'auth': auth.toJson(),
45 0 : if (refreshToken != null) 'refresh_token': refreshToken,
46 : }),
47 : );
48 0 : final response = await httpClient.send(request);
49 0 : final responseBody = await response.stream.toBytes();
50 0 : if (response.statusCode != 200) unexpectedResponse(response, responseBody);
51 0 : final responseString = utf8.decode(responseBody);
52 0 : final json = jsonDecode(responseString);
53 0 : return LoginResponse.fromJson(json);
54 : }
55 : }
|