Request-ify room key store stuff
This commit is contained in:
parent
fc5400a30c
commit
2a6a19e2b0
|
@ -43,9 +43,12 @@ class KeyManager {
|
|||
encryption.ssss.setValidator(MEGOLM_KEY, (String secret) async {
|
||||
final keyObj = olm.PkDecryption();
|
||||
try {
|
||||
final info = await getRoomKeysInfo();
|
||||
final info = await client.api.getRoomKeysBackup();
|
||||
if (!(info.authData is RoomKeysAuthDataV1Curve25519AesSha2)) {
|
||||
return false;
|
||||
}
|
||||
return keyObj.init_with_private_key(base64.decode(secret)) ==
|
||||
info['auth_data']['public_key'];
|
||||
(info.authData as RoomKeysAuthDataV1Curve25519AesSha2).publicKey;
|
||||
} catch (_) {
|
||||
return false;
|
||||
} finally {
|
||||
|
@ -313,13 +316,6 @@ class KeyManager {
|
|||
_outboundGroupSessions[roomId] = sess;
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> getRoomKeysInfo() async {
|
||||
return await client.jsonRequest(
|
||||
type: RequestType.GET,
|
||||
action: '/client/r0/room_keys/version',
|
||||
);
|
||||
}
|
||||
|
||||
Future<bool> isCached() async {
|
||||
if (!enabled) {
|
||||
return false;
|
||||
|
@ -327,50 +323,32 @@ class KeyManager {
|
|||
return (await encryption.ssss.getCached(MEGOLM_KEY)) != null;
|
||||
}
|
||||
|
||||
Future<void> loadFromResponse(Map<String, dynamic> payload) async {
|
||||
Future<void> loadFromResponse(RoomKeys keys) async {
|
||||
if (!(await isCached())) {
|
||||
return;
|
||||
}
|
||||
if (!(payload['rooms'] is Map)) {
|
||||
return;
|
||||
}
|
||||
final privateKey =
|
||||
base64.decode(await encryption.ssss.getCached(MEGOLM_KEY));
|
||||
final decryption = olm.PkDecryption();
|
||||
final info = await getRoomKeysInfo();
|
||||
final info = await client.api.getRoomKeysBackup();
|
||||
String backupPubKey;
|
||||
try {
|
||||
backupPubKey = decryption.init_with_private_key(privateKey);
|
||||
|
||||
if (backupPubKey == null ||
|
||||
!info.containsKey('auth_data') ||
|
||||
!(info['auth_data'] is Map) ||
|
||||
info['auth_data']['public_key'] != backupPubKey) {
|
||||
!(info.authData is RoomKeysAuthDataV1Curve25519AesSha2) ||
|
||||
(info.authData as RoomKeysAuthDataV1Curve25519AesSha2).publicKey != backupPubKey) {
|
||||
return;
|
||||
}
|
||||
for (final roomEntries in payload['rooms'].entries) {
|
||||
final roomId = roomEntries.key;
|
||||
if (!(roomEntries.value is Map) ||
|
||||
!(roomEntries.value['sessions'] is Map)) {
|
||||
continue;
|
||||
}
|
||||
for (final sessionEntries in roomEntries.value['sessions'].entries) {
|
||||
final sessionId = sessionEntries.key;
|
||||
final rawEncryptedSession = sessionEntries.value;
|
||||
if (!(rawEncryptedSession is Map)) {
|
||||
continue;
|
||||
}
|
||||
final firstMessageIndex =
|
||||
rawEncryptedSession['first_message_index'] is int
|
||||
? rawEncryptedSession['first_message_index']
|
||||
: null;
|
||||
final forwardedCount = rawEncryptedSession['forwarded_count'] is int
|
||||
? rawEncryptedSession['forwarded_count']
|
||||
: null;
|
||||
final isVerified = rawEncryptedSession['is_verified'] is bool
|
||||
? rawEncryptedSession['is_verified']
|
||||
: null;
|
||||
final sessionData = rawEncryptedSession['session_data'];
|
||||
for (final roomEntry in keys.rooms.entries) {
|
||||
final roomId = roomEntry.key;
|
||||
for (final sessionEntry in roomEntry.value.sessions.entries) {
|
||||
final sessionId = sessionEntry.key;
|
||||
final session = sessionEntry.value;
|
||||
final firstMessageIndex = session.firstMessageIndex;
|
||||
final forwardedCount = session.forwardedCount;
|
||||
final isVerified = session.isVerified;
|
||||
final sessionData = session.sessionData;
|
||||
if (firstMessageIndex == null ||
|
||||
forwardedCount == null ||
|
||||
isVerified == null ||
|
||||
|
@ -399,21 +377,18 @@ class KeyManager {
|
|||
}
|
||||
|
||||
Future<void> loadSingleKey(String roomId, String sessionId) async {
|
||||
final info = await getRoomKeysInfo();
|
||||
final ret = await client.jsonRequest(
|
||||
type: RequestType.GET,
|
||||
action:
|
||||
'/client/r0/room_keys/keys/${Uri.encodeComponent(roomId)}/${Uri.encodeComponent(sessionId)}?version=${info['version']}',
|
||||
);
|
||||
await loadFromResponse({
|
||||
final info = await client.api.getRoomKeysBackup();
|
||||
final ret = await client.api.getRoomKeysSingleKey(roomId, sessionId, info.version);
|
||||
final keys = RoomKeys.fromJson({
|
||||
'rooms': {
|
||||
roomId: {
|
||||
'sessions': {
|
||||
sessionId: ret,
|
||||
sessionId: ret.toJson(),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
await loadFromResponse(keys);
|
||||
}
|
||||
|
||||
/// Request a certain key from another device
|
||||
|
@ -422,6 +397,7 @@ class KeyManager {
|
|||
var hadPreviously =
|
||||
getInboundGroupSession(room.id, sessionId, senderKey) != null;
|
||||
try {
|
||||
print('FETCHING FROM KEY STORE...');
|
||||
await loadSingleKey(room.id, sessionId);
|
||||
} catch (err, stacktrace) {
|
||||
print('++++++++++++++++++');
|
||||
|
@ -430,6 +406,7 @@ class KeyManager {
|
|||
}
|
||||
if (!hadPreviously &&
|
||||
getInboundGroupSession(room.id, sessionId, senderKey) != null) {
|
||||
print('GOT FROM KEY STORE, SUCCESS!!!!!');
|
||||
return; // we managed to load the session from online backup, no need to care about it now
|
||||
}
|
||||
// while we just send the to-device event to '*', we still need to save the
|
||||
|
|
|
@ -46,6 +46,8 @@ export 'package:famedlysdk/matrix_api/model/push_rule_set.dart';
|
|||
export 'package:famedlysdk/matrix_api/model/pusher.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/request_token_response.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/room_alias_informations.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/room_keys_info.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/room_keys_keys.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/room_summary.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/server_capabilities.dart';
|
||||
export 'package:famedlysdk/matrix_api/model/stripped_state_event.dart';
|
||||
|
|
|
@ -49,6 +49,8 @@ import 'model/public_rooms_response.dart';
|
|||
import 'model/push_rule_set.dart';
|
||||
import 'model/pusher.dart';
|
||||
import 'model/room_alias_informations.dart';
|
||||
import 'model/room_keys_info.dart';
|
||||
import 'model/room_keys_keys.dart';
|
||||
import 'model/supported_protocol.dart';
|
||||
import 'model/tag.dart';
|
||||
import 'model/third_party_identifier.dart';
|
||||
|
@ -2036,4 +2038,148 @@ class MatrixApi {
|
|||
);
|
||||
return;
|
||||
}
|
||||
|
||||
/// Create room keys backup
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#post-matrix-client-r0-room-keys-version
|
||||
Future<String> createRoomKeysBackup(RoomKeysAlgorithmType algorithm, RoomKeysAuthData authData) async {
|
||||
final ret = await request(
|
||||
RequestType.POST,
|
||||
'/client/unstable/room_keys/version',
|
||||
data: {
|
||||
'algorithm': algorithm.algorithmString,
|
||||
'auth_data': authData.toJson(),
|
||||
},
|
||||
);
|
||||
return ret['version'];
|
||||
}
|
||||
|
||||
/// Gets a room key backup
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#get-matrix-client-r0-room-keys-version
|
||||
Future<RoomKeysVersionResponse> getRoomKeysBackup([String version]) async {
|
||||
var url = '/client/unstable/room_keys/version';
|
||||
if (version != null) {
|
||||
url += '/${Uri.encodeComponent(version)}';
|
||||
}
|
||||
final ret = await request(
|
||||
RequestType.GET,
|
||||
url,
|
||||
);
|
||||
return RoomKeysVersionResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Updates a room key backup
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#put-matrix-client-r0-room-keys-version-version
|
||||
Future<void> updateRoomKeysBackup(String version, RoomKeysAlgorithmType algorithm, RoomKeysAuthData authData) async {
|
||||
await request(
|
||||
RequestType.PUT,
|
||||
'/client/unstable/room_keys/version/${Uri.encodeComponent(version)}',
|
||||
data: {
|
||||
'algorithm': algorithm.algorithmString,
|
||||
'auth_data': authData.toJson,
|
||||
'version': version,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// Deletes a room key backup
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#delete-matrix-client-r0-room-keys-version-version
|
||||
Future<void> deleteRoomKeysBackup(String version) async {
|
||||
await request(
|
||||
RequestType.DELETE,
|
||||
'/client/unstable/room_keys/version/${Uri.encodeComponent(version)}',
|
||||
);
|
||||
}
|
||||
|
||||
/// Stores a single room key
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#put-matrix-client-r0-room-keys-keys-roomid-sessionid
|
||||
Future<RoomKeysUpdateResponse> storeRoomKeysSingleKey(String roomId, String sessionId, String version, RoomKeysSingleKey session) async {
|
||||
final ret = await request(
|
||||
RequestType.PUT,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}/${Uri.encodeComponent(sessionId)}?version=${Uri.encodeComponent(version)}',
|
||||
data: session.toJson(),
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Gets a single room key
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#get-matrix-client-r0-room-keys-keys-roomid-sessionid
|
||||
Future<RoomKeysSingleKey> getRoomKeysSingleKey(String roomId, String sessionId, String version) async {
|
||||
final ret = await request(
|
||||
RequestType.GET,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}/${Uri.encodeComponent(sessionId)}?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeysSingleKey.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Deletes a single room key
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#delete-matrix-client-r0-room-keys-keys-roomid-sessionid
|
||||
Future<RoomKeysUpdateResponse> deleteRoomKeysSingleKey(String roomId, String sessionId, String version) async {
|
||||
final ret = await request(
|
||||
RequestType.DELETE,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}/${Uri.encodeComponent(sessionId)}?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Stores room keys for a room
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#put-matrix-client-r0-room-keys-keys-roomid
|
||||
Future<RoomKeysUpdateResponse> storeRoomKeysRoom(String roomId, String version, RoomKeysRoom keys) async {
|
||||
final ret = await request(
|
||||
RequestType.PUT,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}?version=${Uri.encodeComponent(version)}',
|
||||
data: keys.toJson(),
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Gets room keys for a room
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#get-matrix-client-r0-room-keys-keys-roomid
|
||||
Future<RoomKeysRoom> getRoomKeysRoom(String roomId, String version) async {
|
||||
final ret = await request(
|
||||
RequestType.GET,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeysRoom.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Deletes room ekys for a room
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#delete-matrix-client-r0-room-keys-keys-roomid
|
||||
Future<RoomKeysUpdateResponse> deleteRoomKeysRoom(String roomId, String version) async {
|
||||
final ret = await request(
|
||||
RequestType.DELETE,
|
||||
'/client/unstable/room_keys/keys/${Uri.encodeComponent(roomId)}?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// Store multiple room keys
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#put-matrix-client-r0-room-keys-keys
|
||||
Future<RoomKeysUpdateResponse> storeRoomKeys(String version, RoomKeys keys) async {
|
||||
final ret = await request(
|
||||
RequestType.PUT,
|
||||
'/client/unstable/room_keys/keys?version=${Uri.encodeComponent(version)}',
|
||||
data: keys.toJson(),
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
|
||||
/// get all room keys
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#get-matrix-client-r0-room-keys-keys
|
||||
Future<RoomKeys> getRoomKeys(String version) async {
|
||||
final ret = await request(
|
||||
RequestType.GET,
|
||||
'/client/unstable/room_keys/keys?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeys.fromJson(ret);
|
||||
}
|
||||
|
||||
/// delete all room keys
|
||||
/// https://matrix.org/docs/spec/client_server/unstable#delete-matrix-client-r0-room-keys-keys
|
||||
Future<RoomKeysUpdateResponse> deleteRoomKeys(String version) async {
|
||||
final ret = await request(
|
||||
RequestType.DELETE,
|
||||
'/client/unstable/room_keys/keys?version=${Uri.encodeComponent(version)}',
|
||||
);
|
||||
return RoomKeysUpdateResponse.fromJson(ret);
|
||||
}
|
||||
}
|
||||
|
|
107
lib/matrix_api/model/room_keys_info.dart
Normal file
107
lib/matrix_api/model/room_keys_info.dart
Normal file
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* Famedly Matrix SDK
|
||||
* Copyright (C) 2020 Famedly GmbH
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
enum RoomKeysAlgorithmType { v1Curve25519AesSha2 }
|
||||
|
||||
extension RoomKeysAlgorithmTypeExtension on RoomKeysAlgorithmType {
|
||||
String get algorithmString {
|
||||
switch (this) {
|
||||
case RoomKeysAlgorithmType.v1Curve25519AesSha2:
|
||||
return 'm.megolm_backup.v1.curve25519-aes-sha2';
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static RoomKeysAlgorithmType fromAlgorithmString(String s) {
|
||||
switch (s) {
|
||||
case 'm.megolm_backup.v1.curve25519-aes-sha2':
|
||||
return RoomKeysAlgorithmType.v1Curve25519AesSha2;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class RoomKeysAuthData {
|
||||
// This object is used for signing so we need the raw json too
|
||||
Map<String, dynamic> _json;
|
||||
|
||||
RoomKeysAuthData.fromJson(Map<String, dynamic> json) {
|
||||
_json = json;
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return _json;
|
||||
}
|
||||
}
|
||||
|
||||
class RoomKeysAuthDataV1Curve25519AesSha2 extends RoomKeysAuthData {
|
||||
String publicKey;
|
||||
Map<String, Map<String, String>> signatures;
|
||||
|
||||
RoomKeysAuthDataV1Curve25519AesSha2.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
|
||||
publicKey = json['public_key'];
|
||||
signatures = json['signatures'] is Map
|
||||
? Map<String, Map<String, String>>.from((json['signatures'] as Map)
|
||||
.map((k, v) => MapEntry(k, Map<String, String>.from(v))))
|
||||
: null;
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = super.toJson();
|
||||
data['public_key'] = publicKey;
|
||||
if (signatures != null) {
|
||||
data['signatures'] = signatures;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class RoomKeysVersionResponse {
|
||||
RoomKeysAlgorithmType algorithm;
|
||||
RoomKeysAuthData authData;
|
||||
int count;
|
||||
String etag;
|
||||
String version;
|
||||
|
||||
RoomKeysVersionResponse.fromJson(Map<String, dynamic> json) {
|
||||
algorithm = RoomKeysAlgorithmTypeExtension.fromAlgorithmString(json['algorithm']);
|
||||
switch (algorithm) {
|
||||
case RoomKeysAlgorithmType.v1Curve25519AesSha2:
|
||||
authData = RoomKeysAuthDataV1Curve25519AesSha2.fromJson(json['auth_data']);
|
||||
break;
|
||||
default:
|
||||
authData = null;
|
||||
}
|
||||
count = json['count'];
|
||||
etag = json['etag'].toString(); // synapse replies an int but docs say string?
|
||||
version = json['version'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['algorithm'] = algorithm?.algorithmString;
|
||||
data['auth_data'] = authData?.toJson();
|
||||
data['count'] = count;
|
||||
data['etag'] = etag;
|
||||
data['version'] = version;
|
||||
return data;
|
||||
}
|
||||
}
|
85
lib/matrix_api/model/room_keys_keys.dart
Normal file
85
lib/matrix_api/model/room_keys_keys.dart
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* Famedly Matrix SDK
|
||||
* Copyright (C) 2020 Famedly GmbH
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
class RoomKeysSingleKey {
|
||||
int firstMessageIndex;
|
||||
int forwardedCount;
|
||||
bool isVerified;
|
||||
Map<String, dynamic> sessionData;
|
||||
|
||||
RoomKeysSingleKey.fromJson(Map<String, dynamic> json) {
|
||||
firstMessageIndex = json['first_message_index'];
|
||||
forwardedCount = json['forwarded_count'];
|
||||
isVerified = json['is_verified'];
|
||||
sessionData = json['session_data'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['first_message_index'] = firstMessageIndex;
|
||||
data['forwarded_count'] = forwardedCount;
|
||||
data['is_verified'] = isVerified;
|
||||
data['session_data'] = sessionData;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class RoomKeysRoom {
|
||||
Map<String, RoomKeysSingleKey> sessions;
|
||||
|
||||
RoomKeysRoom.fromJson(Map<String, dynamic> json) {
|
||||
sessions = (json['sessions'] as Map).map((k, v) => MapEntry(k, RoomKeysSingleKey.fromJson(v)));
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['sessions'] = sessions.map((k, v) => MapEntry(k, v.toJson()));
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class RoomKeys {
|
||||
Map<String, RoomKeysRoom> rooms;
|
||||
|
||||
RoomKeys.fromJson(Map<String, dynamic> json) {
|
||||
rooms = (json['rooms'] as Map).map((k, v) => MapEntry(k, RoomKeysRoom.fromJson(v)));
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['rooms'] = rooms.map((k, v) => MapEntry(k, v.toJson()));
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class RoomKeysUpdateResponse {
|
||||
String etag;
|
||||
int count;
|
||||
|
||||
RoomKeysUpdateResponse.fromJson(Map<String, dynamic> json) {
|
||||
etag = json['etag']; // synapse replies an int but docs say string?
|
||||
count = json['count'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['etag'] = etag;
|
||||
data['count'] = count;
|
||||
return data;
|
||||
}
|
||||
}
|
18
pubspec.lock
18
pubspec.lock
|
@ -333,9 +333,11 @@ packages:
|
|||
matrix_file_e2ee:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "/home/sorunome/repos/famedly/matrix_file_e2ee"
|
||||
relative: false
|
||||
source: path
|
||||
path: "."
|
||||
ref: "1.x.y"
|
||||
resolved-ref: "32edeff765369a7a77a0822f4b19302ca24a017b"
|
||||
url: "https://gitlab.com/famedly/libraries/matrix_file_e2ee.git"
|
||||
source: git
|
||||
version: "1.0.3"
|
||||
meta:
|
||||
dependency: transitive
|
||||
|
@ -410,10 +412,12 @@ packages:
|
|||
olm:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "/home/sorunome/repos/famedly/dart-olm"
|
||||
relative: false
|
||||
source: path
|
||||
version: "1.1.1"
|
||||
path: "."
|
||||
ref: "1.x.y"
|
||||
resolved-ref: "8e4fcccff7a2d4d0bd5142964db092bf45061905"
|
||||
url: "https://gitlab.com/famedly/libraries/dart-olm.git"
|
||||
source: git
|
||||
version: "1.2.0"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
14
pubspec.yaml
14
pubspec.yaml
|
@ -22,16 +22,14 @@ dependencies:
|
|||
password_hash: ^2.0.0
|
||||
|
||||
olm:
|
||||
path: /home/sorunome/repos/famedly/dart-olm
|
||||
# git:
|
||||
# url: https://gitlab.com/famedly/libraries/dart-olm.git
|
||||
# ref: 0c612a525511652a7760126b058de8c924fe8900
|
||||
git:
|
||||
url: https://gitlab.com/famedly/libraries/dart-olm.git
|
||||
ref: 1.x.y
|
||||
|
||||
matrix_file_e2ee:
|
||||
path: /home/sorunome/repos/famedly/matrix_file_e2ee
|
||||
# git:
|
||||
# url: https://gitlab.com/famedly/libraries/matrix_file_e2ee.git
|
||||
# ref: 1.x.y
|
||||
git:
|
||||
url: https://gitlab.com/famedly/libraries/matrix_file_e2ee.git
|
||||
ref: 1.x.y
|
||||
|
||||
dev_dependencies:
|
||||
test: ^1.0.0
|
||||
|
|
Loading…
Reference in a new issue