From 0be548e4e991aca217165c0f6e6429d44120c75e Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sun, 12 Jan 2020 11:30:05 +0100 Subject: [PATCH] [Client] Implement request openID --- lib/famedlysdk.dart | 1 + lib/src/client.dart | 10 ++++++++++ lib/src/utils/open_id_credentials.dart | 19 +++++++++++++++++++ test/client_test.dart | 9 +++++++++ test/fake_matrix_api.dart | 7 +++++++ 5 files changed, 46 insertions(+) create mode 100644 lib/src/utils/open_id_credentials.dart diff --git a/lib/famedlysdk.dart b/lib/famedlysdk.dart index 0447fb9..55117b8 100644 --- a/lib/famedlysdk.dart +++ b/lib/famedlysdk.dart @@ -29,6 +29,7 @@ export 'package:famedlysdk/src/sync/user_update.dart'; export 'package:famedlysdk/src/utils/matrix_exception.dart'; export 'package:famedlysdk/src/utils/matrix_file.dart'; export 'package:famedlysdk/src/utils/mx_content.dart'; +export 'package:famedlysdk/src/utils/open_id_credentials.dart'; export 'package:famedlysdk/src/utils/profile.dart'; export 'package:famedlysdk/src/utils/push_rules.dart'; export 'package:famedlysdk/src/utils/receipt.dart'; diff --git a/lib/src/client.dart b/lib/src/client.dart index f5fc9bd..cbb8f4b 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -30,6 +30,7 @@ import 'package:famedlysdk/src/presence.dart'; import 'package:famedlysdk/src/store_api.dart'; import 'package:famedlysdk/src/sync/user_update.dart'; import 'package:famedlysdk/src/utils/matrix_file.dart'; +import 'package:famedlysdk/src/utils/open_id_credentials.dart'; import 'package:famedlysdk/src/utils/turn_server_credentials.dart'; import 'package:pedantic/pedantic.dart'; import 'room.dart'; @@ -1050,4 +1051,13 @@ class Client { rooms?.sort(sortRoomsBy); _sortLock = false; } + + /// Gets an OpenID token object that the requester may supply to another service to verify their identity in Matrix. + /// The generated token is only valid for exchanging for user information from the federation API for OpenID. + Future requestOpenIdCredentials() async { + final Map response = await jsonRequest( + type: HTTPType.GET, + action: "/client/r0/user/$userID/openid/request_token"); + return OpenIdCredentials.fromJson(response); + } } diff --git a/lib/src/utils/open_id_credentials.dart b/lib/src/utils/open_id_credentials.dart new file mode 100644 index 0000000..8abaea6 --- /dev/null +++ b/lib/src/utils/open_id_credentials.dart @@ -0,0 +1,19 @@ +class OpenIdCredentials { + String accessToken; + String tokenType; + String matrixServerName; + int expiresIn; + + OpenIdCredentials( + {this.accessToken, + this.tokenType, + this.matrixServerName, + this.expiresIn}); + + OpenIdCredentials.fromJson(Map json) { + accessToken = json['access_token']; + tokenType = json['token_type']; + matrixServerName = json['matrix_server_name']; + expiresIn = json['expires_in']; + } +} diff --git a/test/client_test.dart b/test/client_test.dart index e8dcd97..562f32a 100644 --- a/test/client_test.dart +++ b/test/client_test.dart @@ -23,6 +23,7 @@ import 'dart:async'; +import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/src/account_data.dart'; import 'package:famedlysdk/src/client.dart'; import 'package:famedlysdk/src/presence.dart'; @@ -315,6 +316,14 @@ void main() { expect(loginResp, true); }); + test('createRoom', () async { + final OpenIdCredentials openId = await matrix.requestOpenIdCredentials(); + expect(openId.accessToken, "SomeT0kenHere"); + expect(openId.tokenType, "Bearer"); + expect(openId.matrixServerName, "example.com"); + expect(openId.expiresIn, 3600); + }); + test('createRoom', () async { final List users = [ User("@alice:fakeServer.notExisting"), diff --git a/test/fake_matrix_api.dart b/test/fake_matrix_api.dart index e0ef058..e081dcc 100644 --- a/test/fake_matrix_api.dart +++ b/test/fake_matrix_api.dart @@ -522,6 +522,13 @@ class FakeMatrixApi extends MockClient { static final Map> api = { "GET": { + "/client/r0/user/@test:fakeServer.notExisting/openid/request_token": + (var req) => { + "access_token": "SomeT0kenHere", + "token_type": "Bearer", + "matrix_server_name": "example.com", + "expires_in": 3600 + }, "/client/r0/rooms/1/state/m.room.member/@alice:example.com": (var req) => {"displayname": "Alice"}, "/client/r0/profile/@getme:example.com": (var req) => {