mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-16 02:05:06 +08:00
Cleanup var -> val
This commit is contained in:
parent
d6434654e2
commit
ccfa59ad31
@ -340,18 +340,14 @@ class CryptoTestHelper(val mTestHelper: CommonTestHelper) {
|
|||||||
fun createFakeMegolmBackupAuthData(): MegolmBackupAuthData {
|
fun createFakeMegolmBackupAuthData(): MegolmBackupAuthData {
|
||||||
return MegolmBackupAuthData(
|
return MegolmBackupAuthData(
|
||||||
publicKey = "abcdefg",
|
publicKey = "abcdefg",
|
||||||
signatures = HashMap<String, Map<String, String>>().apply {
|
signatures = mapOf("something" to mapOf("ed25519:something" to "hijklmnop"))
|
||||||
this["something"] = HashMap<String, String>().apply {
|
|
||||||
this["ed25519:something"] = "hijklmnop"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createFakeMegolmBackupCreationInfo(): MegolmBackupCreationInfo {
|
fun createFakeMegolmBackupCreationInfo(): MegolmBackupCreationInfo {
|
||||||
return MegolmBackupCreationInfo().apply {
|
return MegolmBackupCreationInfo(
|
||||||
algorithm = MXCRYPTO_ALGORITHM_MEGOLM_BACKUP
|
algorithm = MXCRYPTO_ALGORITHM_MEGOLM_BACKUP,
|
||||||
authData = createFakeMegolmBackupAuthData()
|
authData = createFakeMegolmBackupAuthData()
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,13 +46,13 @@ import com.squareup.moshi.JsonClass
|
|||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class WellKnown(
|
data class WellKnown(
|
||||||
@Json(name = "m.homeserver")
|
@Json(name = "m.homeserver")
|
||||||
var homeServer: WellKnownBaseConfig? = null,
|
val homeServer: WellKnownBaseConfig? = null,
|
||||||
|
|
||||||
@Json(name = "m.identity_server")
|
@Json(name = "m.identity_server")
|
||||||
var identityServer: WellKnownBaseConfig? = null,
|
val identityServer: WellKnownBaseConfig? = null,
|
||||||
|
|
||||||
@Json(name = "m.integrations")
|
@Json(name = "m.integrations")
|
||||||
var integrations: Map<String, @JvmSuppressWildcards Any>? = null
|
val integrations: Map<String, @JvmSuppressWildcards Any>? = null
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Returns the list of integration managers proposed
|
* Returns the list of integration managers proposed
|
||||||
|
@ -24,7 +24,7 @@ internal data class CreateRoomResponse(
|
|||||||
/**
|
/**
|
||||||
* Required. The created room's ID.
|
* Required. The created room's ID.
|
||||||
*/
|
*/
|
||||||
@Json(name = "room_id") var roomId: String
|
@Json(name = "room_id") val roomId: String
|
||||||
)
|
)
|
||||||
|
|
||||||
internal typealias JoinRoomResponse = CreateRoomResponse
|
internal typealias JoinRoomResponse = CreateRoomResponse
|
||||||
|
@ -27,5 +27,5 @@ data class PublicRoomsFilter(
|
|||||||
* A string to search for in the room metadata, e.g. name, topic, canonical alias etc. (Optional).
|
* A string to search for in the room metadata, e.g. name, topic, canonical alias etc. (Optional).
|
||||||
*/
|
*/
|
||||||
@Json(name = "generic_search_term")
|
@Json(name = "generic_search_term")
|
||||||
var searchTerm: String? = null
|
val searchTerm: String? = null
|
||||||
)
|
)
|
||||||
|
@ -28,30 +28,30 @@ data class PublicRoomsParams(
|
|||||||
* Limit the number of results returned.
|
* Limit the number of results returned.
|
||||||
*/
|
*/
|
||||||
@Json(name = "limit")
|
@Json(name = "limit")
|
||||||
var limit: Int? = null,
|
val limit: Int? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pagination token from a previous request, allowing clients to get the next (or previous) batch of rooms.
|
* A pagination token from a previous request, allowing clients to get the next (or previous) batch of rooms.
|
||||||
* The direction of pagination is specified solely by which token is supplied, rather than via an explicit flag.
|
* The direction of pagination is specified solely by which token is supplied, rather than via an explicit flag.
|
||||||
*/
|
*/
|
||||||
@Json(name = "since")
|
@Json(name = "since")
|
||||||
var since: String? = null,
|
val since: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter to apply to the results.
|
* Filter to apply to the results.
|
||||||
*/
|
*/
|
||||||
@Json(name = "filter")
|
@Json(name = "filter")
|
||||||
var filter: PublicRoomsFilter? = null,
|
val filter: PublicRoomsFilter? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not to include all known networks/protocols from application services on the homeserver. Defaults to false.
|
* Whether or not to include all known networks/protocols from application services on the homeserver. Defaults to false.
|
||||||
*/
|
*/
|
||||||
@Json(name = "include_all_networks")
|
@Json(name = "include_all_networks")
|
||||||
var includeAllNetworks: Boolean = false,
|
val includeAllNetworks: Boolean = false,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The specific third party network/protocol to request from the homeserver. Can only be used if include_all_networks is false.
|
* The specific third party network/protocol to request from the homeserver. Can only be used if include_all_networks is false.
|
||||||
*/
|
*/
|
||||||
@Json(name = "third_party_instance_id")
|
@Json(name = "third_party_instance_id")
|
||||||
var thirdPartyInstanceId: String? = null
|
val thirdPartyInstanceId: String? = null
|
||||||
)
|
)
|
||||||
|
@ -26,7 +26,7 @@ data class ThirdPartyProtocol(
|
|||||||
* where higher groupings are ordered first. For example, the name of a network should be searched before the nickname of a user.
|
* where higher groupings are ordered first. For example, the name of a network should be searched before the nickname of a user.
|
||||||
*/
|
*/
|
||||||
@Json(name = "user_fields")
|
@Json(name = "user_fields")
|
||||||
var userFields: List<String>? = null,
|
val userFields: List<String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Fields which may be used to identify a third party location. These should be ordered to suggest the way that
|
* Required. Fields which may be used to identify a third party location. These should be ordered to suggest the way that
|
||||||
@ -34,15 +34,15 @@ data class ThirdPartyProtocol(
|
|||||||
* searched before the name of a channel.
|
* searched before the name of a channel.
|
||||||
*/
|
*/
|
||||||
@Json(name = "location_fields")
|
@Json(name = "location_fields")
|
||||||
var locationFields: List<String>? = null,
|
val locationFields: List<String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. A content URI representing an icon for the third party protocol.
|
* Required. A content URI representing an icon for the third party protocol.
|
||||||
*
|
*
|
||||||
* FIXDOC: This field was not present in legacy Riot, and it is sometimes sent by the server (no not Required?)
|
* FIXDOC: This field was not present in legacy Riot, and it is sometimes sent by the server (so not Required?)
|
||||||
*/
|
*/
|
||||||
@Json(name = "icon")
|
@Json(name = "icon")
|
||||||
var icon: String? = null,
|
val icon: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The type definitions for the fields defined in the user_fields and location_fields. Each entry in those arrays MUST have an entry here.
|
* Required. The type definitions for the fields defined in the user_fields and location_fields. Each entry in those arrays MUST have an entry here.
|
||||||
@ -51,12 +51,12 @@ data class ThirdPartyProtocol(
|
|||||||
* May be an empty object if no fields are defined.
|
* May be an empty object if no fields are defined.
|
||||||
*/
|
*/
|
||||||
@Json(name = "field_types")
|
@Json(name = "field_types")
|
||||||
var fieldTypes: Map<String, FieldType>? = null,
|
val fieldTypes: Map<String, FieldType>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. A list of objects representing independent instances of configuration. For example, multiple networks on IRC
|
* Required. A list of objects representing independent instances of configuration. For example, multiple networks on IRC
|
||||||
* if multiple are provided by the same application service.
|
* if multiple are provided by the same application service.
|
||||||
*/
|
*/
|
||||||
@Json(name = "instances")
|
@Json(name = "instances")
|
||||||
var instances: List<ThirdPartyProtocolInstance>? = null
|
val instances: List<ThirdPartyProtocolInstance>? = null
|
||||||
)
|
)
|
||||||
|
@ -25,35 +25,35 @@ data class ThirdPartyProtocolInstance(
|
|||||||
* Required. A human-readable description for the protocol, such as the name.
|
* Required. A human-readable description for the protocol, such as the name.
|
||||||
*/
|
*/
|
||||||
@Json(name = "desc")
|
@Json(name = "desc")
|
||||||
var desc: String? = null,
|
val desc: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An optional content URI representing the protocol. Overrides the one provided at the higher level Protocol object.
|
* An optional content URI representing the protocol. Overrides the one provided at the higher level Protocol object.
|
||||||
*/
|
*/
|
||||||
@Json(name = "icon")
|
@Json(name = "icon")
|
||||||
var icon: String? = null,
|
val icon: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Preset values for fields the client may use to search by.
|
* Required. Preset values for fields the client may use to search by.
|
||||||
*/
|
*/
|
||||||
@Json(name = "fields")
|
@Json(name = "fields")
|
||||||
var fields: Map<String, Any>? = null,
|
val fields: Map<String, Any>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. A unique identifier across all instances.
|
* Required. A unique identifier across all instances.
|
||||||
*/
|
*/
|
||||||
@Json(name = "network_id")
|
@Json(name = "network_id")
|
||||||
var networkId: String? = null,
|
val networkId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FIXDOC Not documented on matrix.org doc
|
* FIXDOC Not documented on matrix.org doc
|
||||||
*/
|
*/
|
||||||
@Json(name = "instance_id")
|
@Json(name = "instance_id")
|
||||||
var instanceId: String? = null,
|
val instanceId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FIXDOC Not documented on matrix.org doc
|
* FIXDOC Not documented on matrix.org doc
|
||||||
*/
|
*/
|
||||||
@Json(name = "bot_user_id")
|
@Json(name = "bot_user_id")
|
||||||
var botUserId: String? = null
|
val botUserId: String? = null
|
||||||
)
|
)
|
||||||
|
@ -32,20 +32,20 @@ data class RegistrationFlowResponse(
|
|||||||
* The list of flows.
|
* The list of flows.
|
||||||
*/
|
*/
|
||||||
@Json(name = "flows")
|
@Json(name = "flows")
|
||||||
var flows: List<InteractiveAuthenticationFlow>? = null,
|
val flows: List<InteractiveAuthenticationFlow>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of stages the client has completed successfully.
|
* The list of stages the client has completed successfully.
|
||||||
*/
|
*/
|
||||||
@Json(name = "completed")
|
@Json(name = "completed")
|
||||||
var completedStages: List<String>? = null,
|
val completedStages: List<String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The session identifier that the client must pass back to the home server, if one is provided,
|
* The session identifier that the client must pass back to the home server, if one is provided,
|
||||||
* in subsequent attempts to authenticate in the same API call.
|
* in subsequent attempts to authenticate in the same API call.
|
||||||
*/
|
*/
|
||||||
@Json(name = "session")
|
@Json(name = "session")
|
||||||
var session: String? = null,
|
val session: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The information that the client will need to know in order to use a given type of authentication.
|
* The information that the client will need to know in order to use a given type of authentication.
|
||||||
@ -53,7 +53,7 @@ data class RegistrationFlowResponse(
|
|||||||
* For example, the public key of reCAPTCHA stage could be given here.
|
* For example, the public key of reCAPTCHA stage could be given here.
|
||||||
*/
|
*/
|
||||||
@Json(name = "params")
|
@Json(name = "params")
|
||||||
var params: JsonDict? = null
|
val params: JsonDict? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WARNING,
|
* WARNING,
|
||||||
|
@ -1021,12 +1021,12 @@ internal class DefaultCryptoService @Inject constructor(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val requestBody = RoomKeyRequestBody()
|
val requestBody = RoomKeyRequestBody(
|
||||||
|
algorithm = wireContent["algorithm"]?.toString(),
|
||||||
requestBody.roomId = event.roomId
|
roomId = event.roomId,
|
||||||
requestBody.algorithm = wireContent["algorithm"]?.toString()
|
senderKey = wireContent["sender_key"]?.toString(),
|
||||||
requestBody.senderKey = wireContent["sender_key"]?.toString()
|
sessionId = wireContent["session_id"]?.toString()
|
||||||
requestBody.sessionId = wireContent["session_id"]?.toString()
|
)
|
||||||
|
|
||||||
outgoingRoomKeyRequestManager.resendRoomKeyRequest(requestBody)
|
outgoingRoomKeyRequestManager.resendRoomKeyRequest(requestBody)
|
||||||
}
|
}
|
||||||
|
@ -25,54 +25,54 @@ import im.vector.matrix.android.internal.crypto.model.rest.RoomKeyShareRequest
|
|||||||
/**
|
/**
|
||||||
* IncomingRoomKeyRequest class defines the incoming room keys request.
|
* IncomingRoomKeyRequest class defines the incoming room keys request.
|
||||||
*/
|
*/
|
||||||
open class IncomingRoomKeyRequest {
|
data class IncomingRoomKeyRequest(
|
||||||
/**
|
/**
|
||||||
* The user id
|
* The user id
|
||||||
*/
|
*/
|
||||||
var userId: String? = null
|
override val userId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The device id
|
* The device id
|
||||||
*/
|
*/
|
||||||
var deviceId: String? = null
|
override val deviceId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The request id
|
* The request id
|
||||||
*/
|
*/
|
||||||
var requestId: String? = null
|
override val requestId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The request body
|
* The request body
|
||||||
*/
|
*/
|
||||||
var requestBody: RoomKeyRequestBody? = null
|
val requestBody: RoomKeyRequestBody? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The runnable to call to accept to share the keys
|
* The runnable to call to accept to share the keys
|
||||||
*/
|
*/
|
||||||
@Transient
|
@Transient
|
||||||
var share: Runnable? = null
|
var share: Runnable? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The runnable to call to ignore the key share request.
|
* The runnable to call to ignore the key share request.
|
||||||
*/
|
*/
|
||||||
@Transient
|
@Transient
|
||||||
var ignore: Runnable? = null
|
var ignore: Runnable? = null
|
||||||
|
) : IncomingRoomKeyRequestCommon {
|
||||||
|
companion object {
|
||||||
|
/**
|
||||||
|
* Factory
|
||||||
|
*
|
||||||
|
* @param event the event
|
||||||
|
*/
|
||||||
|
fun fromEvent(event: Event): IncomingRoomKeyRequest {
|
||||||
|
val roomKeyShareRequest = event.getClearContent().toModel<RoomKeyShareRequest>()!!
|
||||||
|
|
||||||
/**
|
return IncomingRoomKeyRequest(
|
||||||
* Constructor
|
userId = event.senderId,
|
||||||
*
|
deviceId = roomKeyShareRequest.requestingDeviceId,
|
||||||
* @param event the event
|
requestId = roomKeyShareRequest.requestId,
|
||||||
*/
|
requestBody = roomKeyShareRequest.body ?: RoomKeyRequestBody()
|
||||||
constructor(event: Event) {
|
)
|
||||||
userId = event.senderId
|
}
|
||||||
val roomKeyShareRequest = event.getClearContent().toModel<RoomKeyShareRequest>()!!
|
|
||||||
deviceId = roomKeyShareRequest.requestingDeviceId
|
|
||||||
requestId = roomKeyShareRequest.requestId
|
|
||||||
requestBody = if (null != roomKeyShareRequest.body) roomKeyShareRequest.body else RoomKeyRequestBody()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for object creation from crypto store
|
|
||||||
*/
|
|
||||||
constructor()
|
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,43 @@
|
|||||||
package im.vector.matrix.android.internal.crypto
|
package im.vector.matrix.android.internal.crypto
|
||||||
|
|
||||||
import im.vector.matrix.android.api.session.events.model.Event
|
import im.vector.matrix.android.api.session.events.model.Event
|
||||||
|
import im.vector.matrix.android.api.session.events.model.toModel
|
||||||
|
import im.vector.matrix.android.internal.crypto.model.rest.RoomKeyShareCancellation
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IncomingRoomKeyRequestCancellation describes the incoming room key cancellation.
|
* IncomingRoomKeyRequestCancellation describes the incoming room key cancellation.
|
||||||
*/
|
*/
|
||||||
class IncomingRoomKeyRequestCancellation(event: Event) : IncomingRoomKeyRequest(event) {
|
data class IncomingRoomKeyRequestCancellation(
|
||||||
|
/**
|
||||||
|
* The user id
|
||||||
|
*/
|
||||||
|
override val userId: String? = null,
|
||||||
|
|
||||||
init {
|
/**
|
||||||
requestBody = null
|
* The device id
|
||||||
|
*/
|
||||||
|
override val deviceId: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The request id
|
||||||
|
*/
|
||||||
|
override val requestId: String? = null
|
||||||
|
) : IncomingRoomKeyRequestCommon {
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory
|
||||||
|
*
|
||||||
|
* @param event the event
|
||||||
|
*/
|
||||||
|
fun fromEvent(event: Event): IncomingRoomKeyRequestCancellation {
|
||||||
|
val roomKeyShareRequestCancellation = event.getClearContent().toModel<RoomKeyShareCancellation>()!!
|
||||||
|
|
||||||
|
return IncomingRoomKeyRequestCancellation(
|
||||||
|
userId = event.senderId,
|
||||||
|
deviceId = roomKeyShareRequestCancellation.requestingDeviceId,
|
||||||
|
requestId = roomKeyShareRequestCancellation.requestId
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.matrix.android.internal.crypto
|
||||||
|
|
||||||
|
interface IncomingRoomKeyRequestCommon {
|
||||||
|
/**
|
||||||
|
* The user id
|
||||||
|
*/
|
||||||
|
val userId: String?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The device id
|
||||||
|
*/
|
||||||
|
val deviceId: String?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The request id
|
||||||
|
*/
|
||||||
|
val requestId: String?
|
||||||
|
}
|
@ -53,8 +53,8 @@ internal class IncomingRoomKeyRequestManager @Inject constructor(
|
|||||||
fun onRoomKeyRequestEvent(event: Event) {
|
fun onRoomKeyRequestEvent(event: Event) {
|
||||||
val roomKeyShare = event.getClearContent().toModel<RoomKeyShare>()
|
val roomKeyShare = event.getClearContent().toModel<RoomKeyShare>()
|
||||||
when (roomKeyShare?.action) {
|
when (roomKeyShare?.action) {
|
||||||
RoomKeyShare.ACTION_SHARE_REQUEST -> receivedRoomKeyRequests.add(IncomingRoomKeyRequest(event))
|
RoomKeyShare.ACTION_SHARE_REQUEST -> receivedRoomKeyRequests.add(IncomingRoomKeyRequest.fromEvent(event))
|
||||||
RoomKeyShare.ACTION_SHARE_CANCELLATION -> receivedRoomKeyRequestCancellations.add(IncomingRoomKeyRequestCancellation(event))
|
RoomKeyShare.ACTION_SHARE_CANCELLATION -> receivedRoomKeyRequestCancellations.add(IncomingRoomKeyRequestCancellation.fromEvent(event))
|
||||||
else -> Timber.e("## onRoomKeyRequestEvent() : unsupported action ${roomKeyShare?.action}")
|
else -> Timber.e("## onRoomKeyRequestEvent() : unsupported action ${roomKeyShare?.action}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,46 +28,46 @@ data class MegolmSessionData(
|
|||||||
* The algorithm used.
|
* The algorithm used.
|
||||||
*/
|
*/
|
||||||
@Json(name = "algorithm")
|
@Json(name = "algorithm")
|
||||||
var algorithm: String? = null,
|
val algorithm: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unique id for the session.
|
* Unique id for the session.
|
||||||
*/
|
*/
|
||||||
@Json(name = "session_id")
|
@Json(name = "session_id")
|
||||||
var sessionId: String? = null,
|
val sessionId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sender's Curve25519 device key.
|
* Sender's Curve25519 device key.
|
||||||
*/
|
*/
|
||||||
@Json(name = "sender_key")
|
@Json(name = "sender_key")
|
||||||
var senderKey: String? = null,
|
val senderKey: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Room this session is used in.
|
* Room this session is used in.
|
||||||
*/
|
*/
|
||||||
@Json(name = "room_id")
|
@Json(name = "room_id")
|
||||||
var roomId: String? = null,
|
val roomId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base64'ed key data.
|
* Base64'ed key data.
|
||||||
*/
|
*/
|
||||||
@Json(name = "session_key")
|
@Json(name = "session_key")
|
||||||
var sessionKey: String? = null,
|
val sessionKey: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Other keys the sender claims.
|
* Other keys the sender claims.
|
||||||
*/
|
*/
|
||||||
@Json(name = "sender_claimed_keys")
|
@Json(name = "sender_claimed_keys")
|
||||||
var senderClaimedKeys: Map<String, String>? = null,
|
val senderClaimedKeys: Map<String, String>? = null,
|
||||||
|
|
||||||
// This is a shortcut for sender_claimed_keys.get("ed25519")
|
// This is a shortcut for sender_claimed_keys.get("ed25519")
|
||||||
// Keep it for compatibility reason.
|
// Keep it for compatibility reason.
|
||||||
@Json(name = "sender_claimed_ed25519_key")
|
@Json(name = "sender_claimed_ed25519_key")
|
||||||
var senderClaimedEd25519Key: String? = null,
|
val senderClaimedEd25519Key: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Devices which forwarded this session to us (normally empty).
|
* Devices which forwarded this session to us (normally empty).
|
||||||
*/
|
*/
|
||||||
@Json(name = "forwarding_curve25519_key_chain")
|
@Json(name = "forwarding_curve25519_key_chain")
|
||||||
var forwardingCurve25519KeyChain: List<String>? = null
|
val forwardingCurve25519KeyChain: List<String>? = null
|
||||||
)
|
)
|
||||||
|
@ -213,10 +213,11 @@ internal class OutgoingRoomKeyRequestManager @Inject constructor(
|
|||||||
Timber.v("## sendOutgoingRoomKeyRequest() : Requesting keys " + request.requestBody
|
Timber.v("## sendOutgoingRoomKeyRequest() : Requesting keys " + request.requestBody
|
||||||
+ " from " + request.recipients + " id " + request.requestId)
|
+ " from " + request.recipients + " id " + request.requestId)
|
||||||
|
|
||||||
val requestMessage = RoomKeyShareRequest()
|
val requestMessage = RoomKeyShareRequest(
|
||||||
requestMessage.requestingDeviceId = cryptoStore.getDeviceId()
|
requestingDeviceId = cryptoStore.getDeviceId(),
|
||||||
requestMessage.requestId = request.requestId
|
requestId = request.requestId,
|
||||||
requestMessage.body = request.requestBody
|
body = request.requestBody
|
||||||
|
)
|
||||||
|
|
||||||
sendMessageToDevices(requestMessage, request.recipients, request.requestId, object : MatrixCallback<Unit> {
|
sendMessageToDevices(requestMessage, request.recipients, request.requestId, object : MatrixCallback<Unit> {
|
||||||
private fun onDone(state: OutgoingRoomKeyRequest.RequestState) {
|
private fun onDone(state: OutgoingRoomKeyRequest.RequestState) {
|
||||||
@ -253,9 +254,10 @@ internal class OutgoingRoomKeyRequestManager @Inject constructor(
|
|||||||
+ " to " + request.recipients
|
+ " to " + request.recipients
|
||||||
+ " cancellation id " + request.cancellationTxnId)
|
+ " cancellation id " + request.cancellationTxnId)
|
||||||
|
|
||||||
val roomKeyShareCancellation = RoomKeyShareCancellation()
|
val roomKeyShareCancellation = RoomKeyShareCancellation(
|
||||||
roomKeyShareCancellation.requestingDeviceId = cryptoStore.getDeviceId()
|
requestingDeviceId = cryptoStore.getDeviceId(),
|
||||||
roomKeyShareCancellation.requestId = request.cancellationTxnId
|
requestId = request.cancellationTxnId
|
||||||
|
)
|
||||||
|
|
||||||
sendMessageToDevices(roomKeyShareCancellation, request.recipients, request.cancellationTxnId, object : MatrixCallback<Unit> {
|
sendMessageToDevices(roomKeyShareCancellation, request.recipients, request.cancellationTxnId, object : MatrixCallback<Unit> {
|
||||||
private fun onDone() {
|
private fun onDone() {
|
||||||
|
@ -66,12 +66,12 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi
|
|||||||
totalNumbersOfImportedKeys++
|
totalNumbersOfImportedKeys++
|
||||||
|
|
||||||
// cancel any outstanding room key requests for this session
|
// cancel any outstanding room key requests for this session
|
||||||
val roomKeyRequestBody = RoomKeyRequestBody()
|
val roomKeyRequestBody = RoomKeyRequestBody(
|
||||||
|
algorithm = megolmSessionData.algorithm,
|
||||||
roomKeyRequestBody.algorithm = megolmSessionData.algorithm
|
roomId = megolmSessionData.roomId,
|
||||||
roomKeyRequestBody.roomId = megolmSessionData.roomId
|
senderKey = megolmSessionData.senderKey,
|
||||||
roomKeyRequestBody.senderKey = megolmSessionData.senderKey
|
sessionId = megolmSessionData.sessionId
|
||||||
roomKeyRequestBody.sessionId = megolmSessionData.sessionId
|
)
|
||||||
|
|
||||||
outgoingRoomKeyRequestManager.cancelRoomKeyRequest(roomKeyRequestBody)
|
outgoingRoomKeyRequestManager.cancelRoomKeyRequest(roomKeyRequestBody)
|
||||||
|
|
||||||
|
@ -163,12 +163,12 @@ internal class MXMegolmDecryption(private val userId: String,
|
|||||||
recipients.add(senderMap)
|
recipients.add(senderMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
val requestBody = RoomKeyRequestBody()
|
val requestBody = RoomKeyRequestBody(
|
||||||
|
roomId = event.roomId,
|
||||||
requestBody.roomId = event.roomId
|
algorithm = encryptedEventContent.algorithm,
|
||||||
requestBody.algorithm = encryptedEventContent.algorithm
|
senderKey = encryptedEventContent.senderKey,
|
||||||
requestBody.senderKey = encryptedEventContent.senderKey
|
sessionId = encryptedEventContent.sessionId
|
||||||
requestBody.sessionId = encryptedEventContent.sessionId
|
)
|
||||||
|
|
||||||
outgoingRoomKeyRequestManager.sendRoomKeyRequest(requestBody, recipients)
|
outgoingRoomKeyRequestManager.sendRoomKeyRequest(requestBody, recipients)
|
||||||
}
|
}
|
||||||
@ -264,12 +264,12 @@ internal class MXMegolmDecryption(private val userId: String,
|
|||||||
if (added) {
|
if (added) {
|
||||||
defaultKeysBackupService.maybeBackupKeys()
|
defaultKeysBackupService.maybeBackupKeys()
|
||||||
|
|
||||||
val content = RoomKeyRequestBody()
|
val content = RoomKeyRequestBody(
|
||||||
|
algorithm = roomKeyContent.algorithm,
|
||||||
content.algorithm = roomKeyContent.algorithm
|
roomId = roomKeyContent.roomId,
|
||||||
content.roomId = roomKeyContent.roomId
|
sessionId = roomKeyContent.sessionId,
|
||||||
content.sessionId = roomKeyContent.sessionId
|
senderKey = senderKey
|
||||||
content.senderKey = senderKey
|
)
|
||||||
|
|
||||||
outgoingRoomKeyRequestManager.cancelRoomKeyRequest(content)
|
outgoingRoomKeyRequestManager.cancelRoomKeyRequest(content)
|
||||||
|
|
||||||
@ -290,8 +290,8 @@ internal class MXMegolmDecryption(private val userId: String,
|
|||||||
|
|
||||||
override fun hasKeysForKeyRequest(request: IncomingRoomKeyRequest): Boolean {
|
override fun hasKeysForKeyRequest(request: IncomingRoomKeyRequest): Boolean {
|
||||||
val roomId = request.requestBody?.roomId ?: return false
|
val roomId = request.requestBody?.roomId ?: return false
|
||||||
val senderKey = request.requestBody?.senderKey ?: return false
|
val senderKey = request.requestBody.senderKey ?: return false
|
||||||
val sessionId = request.requestBody?.sessionId ?: return false
|
val sessionId = request.requestBody.sessionId ?: return false
|
||||||
return olmDevice.hasInboundSessionKeys(roomId, senderKey, sessionId)
|
return olmDevice.hasInboundSessionKeys(roomId, senderKey, sessionId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,15 +319,14 @@ internal class MXMegolmDecryption(private val userId: String,
|
|||||||
return@mapCatching
|
return@mapCatching
|
||||||
}
|
}
|
||||||
Timber.v("## shareKeysWithDevice() : sharing keys for session" +
|
Timber.v("## shareKeysWithDevice() : sharing keys for session" +
|
||||||
" ${body?.senderKey}|${body?.sessionId} with device $userId:$deviceId")
|
" ${body.senderKey}|${body.sessionId} with device $userId:$deviceId")
|
||||||
|
|
||||||
val payloadJson = mutableMapOf<String, Any>("type" to EventType.FORWARDED_ROOM_KEY)
|
val payloadJson = mutableMapOf<String, Any>("type" to EventType.FORWARDED_ROOM_KEY)
|
||||||
runCatching { olmDevice.getInboundGroupSession(body?.sessionId, body?.senderKey, body?.roomId) }
|
runCatching { olmDevice.getInboundGroupSession(body.sessionId, body.senderKey, body.roomId) }
|
||||||
.fold(
|
.fold(
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
payloadJson["content"] = it.exportKeys()
|
payloadJson["content"] = it.exportKeys() ?: ""
|
||||||
?: ""
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
@ -167,9 +167,7 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
runCatching {
|
runCatching {
|
||||||
withContext(coroutineDispatchers.crypto) {
|
withContext(coroutineDispatchers.crypto) {
|
||||||
val olmPkDecryption = OlmPkDecryption()
|
val olmPkDecryption = OlmPkDecryption()
|
||||||
val megolmBackupAuthData = MegolmBackupAuthData()
|
val megolmBackupAuthData = if (password != null) {
|
||||||
|
|
||||||
if (password != null) {
|
|
||||||
// Generate a private key from the password
|
// Generate a private key from the password
|
||||||
val backgroundProgressListener = if (progressListener == null) {
|
val backgroundProgressListener = if (progressListener == null) {
|
||||||
null
|
null
|
||||||
@ -188,25 +186,30 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val generatePrivateKeyResult = generatePrivateKeyWithPassword(password, backgroundProgressListener)
|
val generatePrivateKeyResult = generatePrivateKeyWithPassword(password, backgroundProgressListener)
|
||||||
megolmBackupAuthData.publicKey = olmPkDecryption.setPrivateKey(generatePrivateKeyResult.privateKey)
|
MegolmBackupAuthData(
|
||||||
megolmBackupAuthData.privateKeySalt = generatePrivateKeyResult.salt
|
publicKey = olmPkDecryption.setPrivateKey(generatePrivateKeyResult.privateKey),
|
||||||
megolmBackupAuthData.privateKeyIterations = generatePrivateKeyResult.iterations
|
privateKeySalt = generatePrivateKeyResult.salt,
|
||||||
|
privateKeyIterations = generatePrivateKeyResult.iterations
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
val publicKey = olmPkDecryption.generateKey()
|
val publicKey = olmPkDecryption.generateKey()
|
||||||
|
|
||||||
megolmBackupAuthData.publicKey = publicKey
|
MegolmBackupAuthData(
|
||||||
|
publicKey = publicKey
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val canonicalJson = JsonCanonicalizer.getCanonicalJson(Map::class.java, megolmBackupAuthData.signalableJSONDictionary())
|
val canonicalJson = JsonCanonicalizer.getCanonicalJson(Map::class.java, megolmBackupAuthData.signalableJSONDictionary())
|
||||||
|
|
||||||
megolmBackupAuthData.signatures = objectSigner.signObject(canonicalJson)
|
val signedMegolmBackupAuthData = megolmBackupAuthData.copy(
|
||||||
|
signatures = objectSigner.signObject(canonicalJson)
|
||||||
|
)
|
||||||
|
|
||||||
val megolmBackupCreationInfo = MegolmBackupCreationInfo()
|
MegolmBackupCreationInfo(
|
||||||
megolmBackupCreationInfo.algorithm = MXCRYPTO_ALGORITHM_MEGOLM_BACKUP
|
algorithm = MXCRYPTO_ALGORITHM_MEGOLM_BACKUP,
|
||||||
megolmBackupCreationInfo.authData = megolmBackupAuthData
|
authData = signedMegolmBackupAuthData,
|
||||||
megolmBackupCreationInfo.recoveryKey = computeRecoveryKey(olmPkDecryption.privateKey())
|
recoveryKey = computeRecoveryKey(olmPkDecryption.privateKey())
|
||||||
|
)
|
||||||
megolmBackupCreationInfo
|
|
||||||
}
|
}
|
||||||
}.foldToCallback(callback)
|
}.foldToCallback(callback)
|
||||||
}
|
}
|
||||||
@ -214,11 +217,12 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
|
|
||||||
override fun createKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
|
override fun createKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
|
||||||
callback: MatrixCallback<KeysVersion>) {
|
callback: MatrixCallback<KeysVersion>) {
|
||||||
val createKeysBackupVersionBody = CreateKeysBackupVersionBody()
|
|
||||||
createKeysBackupVersionBody.algorithm = keysBackupCreationInfo.algorithm
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
createKeysBackupVersionBody.authData = MoshiProvider.providesMoshi().adapter(Map::class.java)
|
val createKeysBackupVersionBody = CreateKeysBackupVersionBody(
|
||||||
.fromJson(keysBackupCreationInfo.authData?.toJsonString() ?: "") as JsonDict?
|
algorithm = keysBackupCreationInfo.algorithm,
|
||||||
|
authData = MoshiProvider.providesMoshi().adapter(Map::class.java)
|
||||||
|
.fromJson(keysBackupCreationInfo.authData?.toJsonString() ?: "") as JsonDict?
|
||||||
|
)
|
||||||
|
|
||||||
keysBackupStateManager.state = KeysBackupState.Enabling
|
keysBackupStateManager.state = KeysBackupState.Enabling
|
||||||
|
|
||||||
@ -229,14 +233,14 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
// Reset backup markers.
|
// Reset backup markers.
|
||||||
cryptoStore.resetBackupMarkers()
|
cryptoStore.resetBackupMarkers()
|
||||||
|
|
||||||
val keyBackupVersion = KeysVersionResult()
|
val keyBackupVersion = KeysVersionResult(
|
||||||
keyBackupVersion.algorithm = createKeysBackupVersionBody.algorithm
|
algorithm = createKeysBackupVersionBody.algorithm,
|
||||||
keyBackupVersion.authData = createKeysBackupVersionBody.authData
|
authData = createKeysBackupVersionBody.authData,
|
||||||
keyBackupVersion.version = data.version
|
version = data.version,
|
||||||
|
// We can consider that the server does not have keys yet
|
||||||
// We can consider that the server does not have keys yet
|
count = 0,
|
||||||
keyBackupVersion.count = 0
|
hash = null
|
||||||
keyBackupVersion.hash = null
|
)
|
||||||
|
|
||||||
enableKeysBackup(keyBackupVersion)
|
enableKeysBackup(keyBackupVersion)
|
||||||
|
|
||||||
@ -406,7 +410,7 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
return keysBackupVersionTrust
|
return keysBackupVersionTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
val mySigs = authData.signatures?.get(userId)
|
val mySigs = authData.signatures[userId]
|
||||||
if (mySigs.isNullOrEmpty()) {
|
if (mySigs.isNullOrEmpty()) {
|
||||||
Timber.v("getKeysBackupTrust: Ignoring key backup because it lacks any signatures from this user")
|
Timber.v("getKeysBackupTrust: Ignoring key backup because it lacks any signatures from this user")
|
||||||
return keysBackupVersionTrust
|
return keysBackupVersionTrust
|
||||||
@ -469,8 +473,7 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
cryptoCoroutineScope.launch(coroutineDispatchers.main) {
|
cryptoCoroutineScope.launch(coroutineDispatchers.main) {
|
||||||
val updateKeysBackupVersionBody = withContext(coroutineDispatchers.crypto) {
|
val updateKeysBackupVersionBody = withContext(coroutineDispatchers.crypto) {
|
||||||
// Get current signatures, or create an empty set
|
// Get current signatures, or create an empty set
|
||||||
val myUserSignatures = authData.signatures?.get(userId)?.toMutableMap()
|
val myUserSignatures = authData.signatures?.get(userId)?.toMutableMap() ?: HashMap()
|
||||||
?: HashMap()
|
|
||||||
|
|
||||||
if (trust) {
|
if (trust) {
|
||||||
// Add current device signature
|
// Add current device signature
|
||||||
@ -487,24 +490,23 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create an updated version of KeysVersionResult
|
// Create an updated version of KeysVersionResult
|
||||||
val updateKeysBackupVersionBody = UpdateKeysBackupVersionBody(keysBackupVersion.version!!)
|
|
||||||
|
|
||||||
updateKeysBackupVersionBody.algorithm = keysBackupVersion.algorithm
|
|
||||||
|
|
||||||
val newMegolmBackupAuthData = authData.copy()
|
val newMegolmBackupAuthData = authData.copy()
|
||||||
|
|
||||||
val newSignatures = newMegolmBackupAuthData.signatures!!.toMutableMap()
|
val newSignatures = newMegolmBackupAuthData.signatures!!.toMutableMap()
|
||||||
newSignatures[userId] = myUserSignatures
|
newSignatures[userId] = myUserSignatures
|
||||||
|
|
||||||
newMegolmBackupAuthData.signatures = newSignatures
|
val newMegolmBackupAuthDataWithNewSignature = newMegolmBackupAuthData.copy(
|
||||||
|
signatures = newSignatures
|
||||||
|
)
|
||||||
|
|
||||||
val moshi = MoshiProvider.providesMoshi()
|
val moshi = MoshiProvider.providesMoshi()
|
||||||
val adapter = moshi.adapter(Map::class.java)
|
val adapter = moshi.adapter(Map::class.java)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
updateKeysBackupVersionBody.authData = adapter.fromJson(newMegolmBackupAuthData.toJsonString()) as Map<String, Any>?
|
UpdateKeysBackupVersionBody(
|
||||||
|
algorithm = keysBackupVersion.algorithm,
|
||||||
updateKeysBackupVersionBody
|
authData = adapter.fromJson(newMegolmBackupAuthDataWithNewSignature.toJsonString()) as Map<String, Any>?,
|
||||||
|
version = keysBackupVersion.version!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
// And send it to the homeserver
|
// And send it to the homeserver
|
||||||
@ -513,13 +515,13 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
this.callback = object : MatrixCallback<Unit> {
|
this.callback = object : MatrixCallback<Unit> {
|
||||||
override fun onSuccess(data: Unit) {
|
override fun onSuccess(data: Unit) {
|
||||||
// Relaunch the state machine on this updated backup version
|
// Relaunch the state machine on this updated backup version
|
||||||
val newKeysBackupVersion = KeysVersionResult()
|
val newKeysBackupVersion = KeysVersionResult(
|
||||||
|
algorithm = keysBackupVersion.algorithm,
|
||||||
newKeysBackupVersion.version = keysBackupVersion.version
|
authData = updateKeysBackupVersionBody.authData,
|
||||||
newKeysBackupVersion.algorithm = keysBackupVersion.algorithm
|
version = keysBackupVersion.version,
|
||||||
newKeysBackupVersion.count = keysBackupVersion.count
|
hash = keysBackupVersion.hash,
|
||||||
newKeysBackupVersion.hash = keysBackupVersion.hash
|
count = keysBackupVersion.count
|
||||||
newKeysBackupVersion.authData = updateKeysBackupVersionBody.authData
|
)
|
||||||
|
|
||||||
checkAndStartWithKeysBackupVersion(newKeysBackupVersion)
|
checkAndStartWithKeysBackupVersion(newKeysBackupVersion)
|
||||||
|
|
||||||
@ -1024,7 +1026,7 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract the recovery key from the passphrase
|
// Extract the recovery key from the passphrase
|
||||||
val data = retrievePrivateKeyWithPassword(password, authData.privateKeySalt!!, authData.privateKeyIterations!!, progressListener)
|
val data = retrievePrivateKeyWithPassword(password, authData.privateKeySalt, authData.privateKeyIterations, progressListener)
|
||||||
|
|
||||||
return computeRecoveryKey(data)
|
return computeRecoveryKey(data)
|
||||||
}
|
}
|
||||||
@ -1178,14 +1180,16 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
|
|
||||||
// Gather data to send to the homeserver
|
// Gather data to send to the homeserver
|
||||||
// roomId -> sessionId -> MXKeyBackupData
|
// roomId -> sessionId -> MXKeyBackupData
|
||||||
val keysBackupData = KeysBackupData()
|
val keysBackupData = KeysBackupData(
|
||||||
keysBackupData.roomIdToRoomKeysBackupData = HashMap()
|
roomIdToRoomKeysBackupData = HashMap()
|
||||||
|
)
|
||||||
|
|
||||||
for (olmInboundGroupSessionWrapper in olmInboundGroupSessionWrappers) {
|
for (olmInboundGroupSessionWrapper in olmInboundGroupSessionWrappers) {
|
||||||
val keyBackupData = encryptGroupSession(olmInboundGroupSessionWrapper)
|
val keyBackupData = encryptGroupSession(olmInboundGroupSessionWrapper)
|
||||||
if (keysBackupData.roomIdToRoomKeysBackupData[olmInboundGroupSessionWrapper.roomId] == null) {
|
if (keysBackupData.roomIdToRoomKeysBackupData[olmInboundGroupSessionWrapper.roomId] == null) {
|
||||||
val roomKeysBackupData = RoomKeysBackupData()
|
val roomKeysBackupData = RoomKeysBackupData(
|
||||||
roomKeysBackupData.sessionIdToKeyBackupData = HashMap()
|
sessionIdToKeyBackupData = HashMap()
|
||||||
|
)
|
||||||
keysBackupData.roomIdToRoomKeysBackupData[olmInboundGroupSessionWrapper.roomId!!] = roomKeysBackupData
|
keysBackupData.roomIdToRoomKeysBackupData[olmInboundGroupSessionWrapper.roomId!!] = roomKeysBackupData
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1301,24 +1305,21 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build backup data for that key
|
// Build backup data for that key
|
||||||
val keyBackupData = KeyBackupData()
|
return KeyBackupData(
|
||||||
try {
|
firstMessageIndex = try {
|
||||||
keyBackupData.firstMessageIndex = olmInboundGroupSessionWrapper.olmInboundGroupSession!!.firstKnownIndex
|
olmInboundGroupSessionWrapper.olmInboundGroupSession!!.firstKnownIndex
|
||||||
} catch (e: OlmException) {
|
} catch (e: OlmException) {
|
||||||
Timber.e(e, "OlmException")
|
Timber.e(e, "OlmException")
|
||||||
}
|
0L
|
||||||
|
},
|
||||||
|
forwardedCount = olmInboundGroupSessionWrapper.forwardingCurve25519KeyChain!!.size,
|
||||||
|
isVerified = device?.isVerified == true,
|
||||||
|
|
||||||
keyBackupData.forwardedCount = olmInboundGroupSessionWrapper.forwardingCurve25519KeyChain!!.size
|
sessionData = mapOf(
|
||||||
keyBackupData.isVerified = device?.isVerified == true
|
"ciphertext" to encryptedSessionBackupData!!.mCipherText,
|
||||||
|
"mac" to encryptedSessionBackupData.mMac,
|
||||||
val data = mapOf(
|
"ephemeral" to encryptedSessionBackupData.mEphemeralKey)
|
||||||
"ciphertext" to encryptedSessionBackupData!!.mCipherText,
|
)
|
||||||
"mac" to encryptedSessionBackupData.mMac,
|
|
||||||
"ephemeral" to encryptedSessionBackupData.mEphemeralKey)
|
|
||||||
|
|
||||||
keyBackupData.sessionData = data
|
|
||||||
|
|
||||||
return keyBackupData
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@ -1350,8 +1351,10 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sessionBackupData != null) {
|
if (sessionBackupData != null) {
|
||||||
sessionBackupData.sessionId = sessionId
|
sessionBackupData = sessionBackupData.copy(
|
||||||
sessionBackupData.roomId = roomId
|
sessionId = sessionId,
|
||||||
|
roomId = roomId
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1370,11 +1373,12 @@ internal class DefaultKeysBackupService @Inject constructor(
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
fun createFakeKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
|
fun createFakeKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
|
||||||
callback: MatrixCallback<KeysVersion>) {
|
callback: MatrixCallback<KeysVersion>) {
|
||||||
val createKeysBackupVersionBody = CreateKeysBackupVersionBody()
|
|
||||||
createKeysBackupVersionBody.algorithm = keysBackupCreationInfo.algorithm
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
createKeysBackupVersionBody.authData = MoshiProvider.providesMoshi().adapter(Map::class.java)
|
val createKeysBackupVersionBody = CreateKeysBackupVersionBody(
|
||||||
.fromJson(keysBackupCreationInfo.authData?.toJsonString() ?: "") as JsonDict?
|
algorithm = keysBackupCreationInfo.algorithm,
|
||||||
|
authData = MoshiProvider.providesMoshi().adapter(Map::class.java)
|
||||||
|
.fromJson(keysBackupCreationInfo.authData?.toJsonString() ?: "") as JsonDict?
|
||||||
|
)
|
||||||
|
|
||||||
createKeysBackupVersionTask
|
createKeysBackupVersionTask
|
||||||
.configureWith(createKeysBackupVersionBody) {
|
.configureWith(createKeysBackupVersionBody) {
|
||||||
|
@ -30,26 +30,27 @@ data class MegolmBackupAuthData(
|
|||||||
* The curve25519 public key used to encrypt the backups.
|
* The curve25519 public key used to encrypt the backups.
|
||||||
*/
|
*/
|
||||||
@Json(name = "public_key")
|
@Json(name = "public_key")
|
||||||
var publicKey: String = "",
|
val publicKey: String = "",
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In case of a backup created from a password, the salt associated with the backup
|
* In case of a backup created from a password, the salt associated with the backup
|
||||||
* private key.
|
* private key.
|
||||||
*/
|
*/
|
||||||
@Json(name = "private_key_salt")
|
@Json(name = "private_key_salt")
|
||||||
var privateKeySalt: String? = null,
|
val privateKeySalt: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In case of a backup created from a password, the number of key derivations.
|
* In case of a backup created from a password, the number of key derivations.
|
||||||
*/
|
*/
|
||||||
@Json(name = "private_key_iterations")
|
@Json(name = "private_key_iterations")
|
||||||
var privateKeyIterations: Int? = null,
|
val privateKeyIterations: Int? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signatures of the public key.
|
* Signatures of the public key.
|
||||||
* userId -> (deviceSignKeyId -> signature)
|
* userId -> (deviceSignKeyId -> signature)
|
||||||
*/
|
*/
|
||||||
var signatures: Map<String, Map<String, String>>? = null
|
@Json(name = "signatures")
|
||||||
|
val signatures: Map<String, Map<String, String>>? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun toJsonString(): String {
|
fun toJsonString(): String {
|
||||||
|
@ -19,20 +19,19 @@ package im.vector.matrix.android.internal.crypto.keysbackup.model
|
|||||||
/**
|
/**
|
||||||
* Data retrieved from Olm library. algorithm and authData will be send to the homeserver, and recoveryKey will be displayed to the user
|
* Data retrieved from Olm library. algorithm and authData will be send to the homeserver, and recoveryKey will be displayed to the user
|
||||||
*/
|
*/
|
||||||
class MegolmBackupCreationInfo {
|
data class MegolmBackupCreationInfo(
|
||||||
|
/**
|
||||||
|
* The algorithm used for storing backups [org.matrix.androidsdk.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP].
|
||||||
|
*/
|
||||||
|
val algorithm: String = "",
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The algorithm used for storing backups [org.matrix.androidsdk.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP].
|
* Authentication data.
|
||||||
*/
|
*/
|
||||||
var algorithm: String = ""
|
val authData: MegolmBackupAuthData? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Authentication data.
|
* The Base58 recovery key.
|
||||||
*/
|
*/
|
||||||
var authData: MegolmBackupAuthData? = null
|
val recoveryKey: String = ""
|
||||||
|
)
|
||||||
/**
|
|
||||||
* The Base58 recovery key.
|
|
||||||
*/
|
|
||||||
var recoveryKey: String = ""
|
|
||||||
}
|
|
||||||
|
@ -16,7 +16,21 @@
|
|||||||
|
|
||||||
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
import im.vector.matrix.android.api.util.JsonDict
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
class CreateKeysBackupVersionBody : KeysAlgorithmAndData()
|
data class CreateKeysBackupVersionBody(
|
||||||
|
/**
|
||||||
|
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
|
||||||
|
*/
|
||||||
|
@Json(name = "algorithm")
|
||||||
|
override val algorithm: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData]
|
||||||
|
*/
|
||||||
|
@Json(name = "auth_data")
|
||||||
|
override val authData: JsonDict? = null
|
||||||
|
) : KeysAlgorithmAndData
|
||||||
|
@ -29,25 +29,25 @@ data class KeyBackupData(
|
|||||||
* Required. The index of the first message in the session that the key can decrypt.
|
* Required. The index of the first message in the session that the key can decrypt.
|
||||||
*/
|
*/
|
||||||
@Json(name = "first_message_index")
|
@Json(name = "first_message_index")
|
||||||
var firstMessageIndex: Long = 0,
|
val firstMessageIndex: Long = 0,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The number of times this key has been forwarded.
|
* Required. The number of times this key has been forwarded.
|
||||||
*/
|
*/
|
||||||
@Json(name = "forwarded_count")
|
@Json(name = "forwarded_count")
|
||||||
var forwardedCount: Int = 0,
|
val forwardedCount: Int = 0,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the device backing up the key has verified the device that the key is from.
|
* Whether the device backing up the key has verified the device that the key is from.
|
||||||
*/
|
*/
|
||||||
@Json(name = "is_verified")
|
@Json(name = "is_verified")
|
||||||
var isVerified: Boolean = false,
|
val isVerified: Boolean = false,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Algorithm-dependent data.
|
* Algorithm-dependent data.
|
||||||
*/
|
*/
|
||||||
@Json(name = "session_data")
|
@Json(name = "session_data")
|
||||||
var sessionData: Map<String, Any>? = null
|
val sessionData: Map<String, Any>? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun toJsonString(): String {
|
fun toJsonString(): String {
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
||||||
|
|
||||||
import com.squareup.moshi.Json
|
|
||||||
import im.vector.matrix.android.api.util.JsonDict
|
import im.vector.matrix.android.api.util.JsonDict
|
||||||
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupAuthData
|
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupAuthData
|
||||||
import im.vector.matrix.android.internal.di.MoshiProvider
|
import im.vector.matrix.android.internal.di.MoshiProvider
|
||||||
@ -38,19 +37,17 @@ import im.vector.matrix.android.internal.di.MoshiProvider
|
|||||||
* }
|
* }
|
||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
open class KeysAlgorithmAndData {
|
interface KeysAlgorithmAndData {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
|
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
|
||||||
*/
|
*/
|
||||||
@Json(name = "algorithm")
|
val algorithm: String?
|
||||||
var algorithm: String? = null
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData]
|
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData]
|
||||||
*/
|
*/
|
||||||
@Json(name = "auth_data")
|
val authData: JsonDict?
|
||||||
var authData: JsonDict? = null
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Facility method to convert authData to a MegolmBackupAuthData object
|
* Facility method to convert authData to a MegolmBackupAuthData object
|
||||||
|
@ -24,9 +24,7 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class KeysBackupData(
|
data class KeysBackupData(
|
||||||
|
|
||||||
// the keys are the room IDs, and the values are RoomKeysBackupData
|
// the keys are the room IDs, and the values are RoomKeysBackupData
|
||||||
@Json(name = "rooms")
|
@Json(name = "rooms")
|
||||||
var roomIdToRoomKeysBackupData: MutableMap<String, RoomKeysBackupData> = HashMap()
|
val roomIdToRoomKeysBackupData: MutableMap<String, RoomKeysBackupData> = HashMap()
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -16,16 +16,33 @@
|
|||||||
|
|
||||||
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
import im.vector.matrix.android.api.util.JsonDict
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class KeysVersionResult(
|
data class KeysVersionResult(
|
||||||
|
/**
|
||||||
|
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
|
||||||
|
*/
|
||||||
|
@Json(name = "algorithm")
|
||||||
|
override val algorithm: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData]
|
||||||
|
*/
|
||||||
|
@Json(name = "auth_data")
|
||||||
|
override val authData: JsonDict? = null,
|
||||||
|
|
||||||
// the backup version
|
// the backup version
|
||||||
var version: String? = null,
|
@Json(name = "version")
|
||||||
|
val version: String? = null,
|
||||||
|
|
||||||
// The hash value which is an opaque string representing stored keys in the backup
|
// The hash value which is an opaque string representing stored keys in the backup
|
||||||
var hash: String? = null,
|
@Json(name = "hash")
|
||||||
|
val hash: String? = null,
|
||||||
|
|
||||||
// The number of keys stored in the backup.
|
// The number of keys stored in the backup.
|
||||||
var count: Int? = null
|
@Json(name = "count")
|
||||||
) : KeysAlgorithmAndData()
|
val count: Int? = null
|
||||||
|
) : KeysAlgorithmAndData
|
||||||
|
@ -24,8 +24,7 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RoomKeysBackupData(
|
data class RoomKeysBackupData(
|
||||||
|
|
||||||
// the keys are the session IDs, and the values are KeyBackupData
|
// the keys are the session IDs, and the values are KeyBackupData
|
||||||
@Json(name = "sessions")
|
@Json(name = "sessions")
|
||||||
var sessionIdToKeyBackupData: MutableMap<String, KeyBackupData> = HashMap()
|
val sessionIdToKeyBackupData: MutableMap<String, KeyBackupData> = HashMap()
|
||||||
)
|
)
|
||||||
|
@ -16,10 +16,25 @@
|
|||||||
|
|
||||||
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
package im.vector.matrix.android.internal.crypto.keysbackup.model.rest
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
import im.vector.matrix.android.api.util.JsonDict
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class UpdateKeysBackupVersionBody(
|
data class UpdateKeysBackupVersionBody(
|
||||||
|
/**
|
||||||
|
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
|
||||||
|
*/
|
||||||
|
@Json(name = "algorithm")
|
||||||
|
override val algorithm: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData]
|
||||||
|
*/
|
||||||
|
@Json(name = "auth_data")
|
||||||
|
override val authData: JsonDict? = null,
|
||||||
|
|
||||||
// the backup version, mandatory
|
// the backup version, mandatory
|
||||||
|
@Json(name = "version")
|
||||||
val version: String
|
val version: String
|
||||||
) : KeysAlgorithmAndData()
|
) : KeysAlgorithmAndData
|
||||||
|
@ -26,48 +26,47 @@ import java.io.Serializable
|
|||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class MXDeviceInfo(
|
data class MXDeviceInfo(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The id of this device.
|
* The id of this device.
|
||||||
*/
|
*/
|
||||||
@Json(name = "device_id")
|
@Json(name = "device_id")
|
||||||
var deviceId: String,
|
val deviceId: String,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the user id
|
* the user id
|
||||||
*/
|
*/
|
||||||
@Json(name = "user_id")
|
@Json(name = "user_id")
|
||||||
var userId: String,
|
val userId: String,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of algorithms supported by this device.
|
* The list of algorithms supported by this device.
|
||||||
*/
|
*/
|
||||||
@Json(name = "algorithms")
|
@Json(name = "algorithms")
|
||||||
var algorithms: List<String>? = null,
|
val algorithms: List<String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map from "<key type>:<deviceId>" to "<base64-encoded key>".
|
* A map from "<key type>:<deviceId>" to "<base64-encoded key>".
|
||||||
*/
|
*/
|
||||||
@Json(name = "keys")
|
@Json(name = "keys")
|
||||||
var keys: Map<String, String>? = null,
|
val keys: Map<String, String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The signature of this MXDeviceInfo.
|
* The signature of this MXDeviceInfo.
|
||||||
* A map from "<userId>" to a map from "<key type>:<deviceId>" to "<signature>"
|
* A map from "<userId>" to a map from "<key type>:<deviceId>" to "<signature>"
|
||||||
*/
|
*/
|
||||||
@Json(name = "signatures")
|
@Json(name = "signatures")
|
||||||
var signatures: Map<String, Map<String, String>>? = null,
|
val signatures: Map<String, Map<String, String>>? = null,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Additional data from the home server.
|
* Additional data from the home server.
|
||||||
*/
|
*/
|
||||||
@Json(name = "unsigned")
|
@Json(name = "unsigned")
|
||||||
var unsigned: JsonDict? = null,
|
val unsigned: JsonDict? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verification state of this device.
|
* Verification state of this device.
|
||||||
*/
|
*/
|
||||||
var verified: Int = DEVICE_VERIFICATION_UNKNOWN
|
val verified: Int = DEVICE_VERIFICATION_UNKNOWN
|
||||||
) : Serializable {
|
) : Serializable {
|
||||||
/**
|
/**
|
||||||
* Tells if the device is unknown
|
* Tells if the device is unknown
|
||||||
@ -137,11 +136,11 @@ data class MXDeviceInfo(
|
|||||||
map["user_id"] = userId
|
map["user_id"] = userId
|
||||||
|
|
||||||
if (null != algorithms) {
|
if (null != algorithms) {
|
||||||
map["algorithms"] = algorithms!!
|
map["algorithms"] = algorithms
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null != keys) {
|
if (null != keys) {
|
||||||
map["keys"] = keys!!
|
map["keys"] = keys
|
||||||
}
|
}
|
||||||
|
|
||||||
return map
|
return map
|
||||||
|
@ -116,16 +116,16 @@ class OlmInboundGroupSessionWrapper : Serializable {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
MegolmSessionData().also {
|
MegolmSessionData(
|
||||||
it.senderClaimedEd25519Key = keysClaimed?.get("ed25519")
|
senderClaimedEd25519Key = keysClaimed?.get("ed25519"),
|
||||||
it.forwardingCurve25519KeyChain = ArrayList(forwardingCurve25519KeyChain!!)
|
forwardingCurve25519KeyChain = ArrayList(forwardingCurve25519KeyChain!!),
|
||||||
it.senderKey = senderKey
|
senderKey = senderKey,
|
||||||
it.senderClaimedKeys = keysClaimed
|
senderClaimedKeys = keysClaimed,
|
||||||
it.roomId = roomId
|
roomId = roomId,
|
||||||
it.sessionId = olmInboundGroupSession!!.sessionIdentifier()
|
sessionId = olmInboundGroupSession!!.sessionIdentifier(),
|
||||||
it.sessionKey = olmInboundGroupSession!!.export(olmInboundGroupSession!!.firstKnownIndex)
|
sessionKey = olmInboundGroupSession!!.export(olmInboundGroupSession!!.firstKnownIndex),
|
||||||
it.algorithm = MXCRYPTO_ALGORITHM_MEGOLM
|
algorithm = MXCRYPTO_ALGORITHM_MEGOLM
|
||||||
}
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Timber.e(e, "## export() : senderKey $senderKey failed")
|
Timber.e(e, "## export() : senderKey $senderKey failed")
|
||||||
null
|
null
|
||||||
|
@ -23,22 +23,21 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class EncryptionEventContent(
|
data class EncryptionEventContent(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The encryption algorithm to be used to encrypt messages sent in this room. Must be 'm.megolm.v1.aes-sha2'.
|
* Required. The encryption algorithm to be used to encrypt messages sent in this room. Must be 'm.megolm.v1.aes-sha2'.
|
||||||
*/
|
*/
|
||||||
@Json(name = "algorithm")
|
@Json(name = "algorithm")
|
||||||
var algorithm: String,
|
val algorithm: String,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How long the session should be used before changing it. 604800000 (a week) is the recommended default.
|
* How long the session should be used before changing it. 604800000 (a week) is the recommended default.
|
||||||
*/
|
*/
|
||||||
@Json(name = "rotation_period_ms")
|
@Json(name = "rotation_period_ms")
|
||||||
var rotationPeriodMs: Long? = null,
|
val rotationPeriodMs: Long? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How many messages should be sent before changing the session. 100 is the recommended default.
|
* How many messages should be sent before changing the session. 100 is the recommended default.
|
||||||
*/
|
*/
|
||||||
@Json(name = "rotation_period_msgs")
|
@Json(name = "rotation_period_msgs")
|
||||||
var rotationPeriodMsgs: Long? = null
|
val rotationPeriodMsgs: Long? = null
|
||||||
)
|
)
|
||||||
|
@ -20,12 +20,11 @@ import com.squareup.moshi.JsonClass
|
|||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class NewDeviceContent(
|
data class NewDeviceContent(
|
||||||
|
|
||||||
// the device id
|
// the device id
|
||||||
@Json(name = "device_id")
|
@Json(name = "device_id")
|
||||||
var deviceId: String? = null,
|
val deviceId: String? = null,
|
||||||
|
|
||||||
// the room ids list
|
// the room ids list
|
||||||
@Json(name = "rooms")
|
@Json(name = "rooms")
|
||||||
var rooms: List<String>? = null
|
val rooms: List<String>? = null
|
||||||
)
|
)
|
||||||
|
@ -27,11 +27,11 @@ data class OlmEventContent(
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Json(name = "ciphertext")
|
@Json(name = "ciphertext")
|
||||||
var ciphertext: Map<String, Any>? = null,
|
val ciphertext: Map<String, Any>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the sender key
|
* the sender key
|
||||||
*/
|
*/
|
||||||
@Json(name = "sender_key")
|
@Json(name = "sender_key")
|
||||||
var senderKey: String? = null
|
val senderKey: String? = null
|
||||||
)
|
)
|
||||||
|
@ -30,31 +30,31 @@ data class DeviceInfo(
|
|||||||
* The owner user id (not documented and useless but the homeserver sent it. You should not need it)
|
* The owner user id (not documented and useless but the homeserver sent it. You should not need it)
|
||||||
*/
|
*/
|
||||||
@Json(name = "user_id")
|
@Json(name = "user_id")
|
||||||
var user_id: String? = null,
|
val user_id: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The device id
|
* The device id
|
||||||
*/
|
*/
|
||||||
@Json(name = "device_id")
|
@Json(name = "device_id")
|
||||||
var deviceId: String? = null,
|
val deviceId: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The device display name
|
* The device display name
|
||||||
*/
|
*/
|
||||||
@Json(name = "display_name")
|
@Json(name = "display_name")
|
||||||
var displayName: String? = null,
|
val displayName: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The last time this device has been seen.
|
* The last time this device has been seen.
|
||||||
*/
|
*/
|
||||||
@Json(name = "last_seen_ts")
|
@Json(name = "last_seen_ts")
|
||||||
var lastSeenTs: Long? = null,
|
val lastSeenTs: Long? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The last ip address
|
* The last ip address
|
||||||
*/
|
*/
|
||||||
@Json(name = "last_seen_ip")
|
@Json(name = "last_seen_ip")
|
||||||
var lastSeenIp: String? = null
|
val lastSeenIp: String? = null
|
||||||
) : DatedObject {
|
) : DatedObject {
|
||||||
|
|
||||||
override val date: Long
|
override val date: Long
|
||||||
|
@ -24,5 +24,5 @@ import com.squareup.moshi.JsonClass
|
|||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class DevicesListResponse(
|
data class DevicesListResponse(
|
||||||
@Json(name = "devices")
|
@Json(name = "devices")
|
||||||
var devices: List<DeviceInfo>? = null
|
val devices: List<DeviceInfo>? = null
|
||||||
)
|
)
|
||||||
|
@ -27,38 +27,38 @@ data class EncryptedFileInfo(
|
|||||||
* Required. The URL to the file.
|
* Required. The URL to the file.
|
||||||
*/
|
*/
|
||||||
@Json(name = "url")
|
@Json(name = "url")
|
||||||
var url: String? = null,
|
val url: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Not documented
|
* Not documented
|
||||||
*/
|
*/
|
||||||
@Json(name = "mimetype")
|
@Json(name = "mimetype")
|
||||||
var mimetype: String? = null,
|
val mimetype: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. A JSON Web Key object.
|
* Required. A JSON Web Key object.
|
||||||
*/
|
*/
|
||||||
@Json(name = "key")
|
@Json(name = "key")
|
||||||
var key: EncryptedFileKey? = null,
|
val key: EncryptedFileKey? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The Initialisation Vector used by AES-CTR, encoded as unpadded base64.
|
* Required. The Initialisation Vector used by AES-CTR, encoded as unpadded base64.
|
||||||
*/
|
*/
|
||||||
@Json(name = "iv")
|
@Json(name = "iv")
|
||||||
var iv: String? = null,
|
val iv: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. A map from an algorithm name to a hash of the ciphertext, encoded as unpadded base64.
|
* Required. A map from an algorithm name to a hash of the ciphertext, encoded as unpadded base64.
|
||||||
* Clients should support the SHA-256 hash, which uses the key "sha256".
|
* Clients should support the SHA-256 hash, which uses the key "sha256".
|
||||||
*/
|
*/
|
||||||
@Json(name = "hashes")
|
@Json(name = "hashes")
|
||||||
var hashes: Map<String, String>? = null,
|
val hashes: Map<String, String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Version of the encrypted attachments protocol. Must be "v2".
|
* Required. Version of the encrypted attachments protocol. Must be "v2".
|
||||||
*/
|
*/
|
||||||
@Json(name = "v")
|
@Json(name = "v")
|
||||||
var v: String? = null
|
val v: String? = null
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Check what the spec tells us
|
* Check what the spec tells us
|
||||||
|
@ -24,31 +24,31 @@ data class EncryptedFileKey(
|
|||||||
* Required. Algorithm. Must be "A256CTR".
|
* Required. Algorithm. Must be "A256CTR".
|
||||||
*/
|
*/
|
||||||
@Json(name = "alg")
|
@Json(name = "alg")
|
||||||
var alg: String? = null,
|
val alg: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Extractable. Must be true. This is a W3C extension.
|
* Required. Extractable. Must be true. This is a W3C extension.
|
||||||
*/
|
*/
|
||||||
@Json(name = "ext")
|
@Json(name = "ext")
|
||||||
var ext: Boolean? = null,
|
val ext: Boolean? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Key operations. Must at least contain "encrypt" and "decrypt".
|
* Required. Key operations. Must at least contain "encrypt" and "decrypt".
|
||||||
*/
|
*/
|
||||||
@Json(name = "key_ops")
|
@Json(name = "key_ops")
|
||||||
var key_ops: List<String>? = null,
|
val key_ops: List<String>? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. Key type. Must be "oct".
|
* Required. Key type. Must be "oct".
|
||||||
*/
|
*/
|
||||||
@Json(name = "kty")
|
@Json(name = "kty")
|
||||||
var kty: String? = null,
|
val kty: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The key, encoded as urlsafe unpadded base64.
|
* Required. The key, encoded as urlsafe unpadded base64.
|
||||||
*/
|
*/
|
||||||
@Json(name = "k")
|
@Json(name = "k")
|
||||||
var k: String? = null
|
val k: String? = null
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Check what the spec tells us
|
* Check what the spec tells us
|
||||||
@ -62,7 +62,7 @@ data class EncryptedFileKey(
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_ops?.contains("encrypt") != true || key_ops?.contains("decrypt") != true) {
|
if (key_ops?.contains("encrypt") != true || !key_ops.contains("decrypt")) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,11 +21,12 @@ import com.squareup.moshi.JsonClass
|
|||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class EncryptedMessage(
|
data class EncryptedMessage(
|
||||||
var algorithm: String? = null,
|
@Json(name = "algorithm")
|
||||||
|
val algorithm: String? = null,
|
||||||
|
|
||||||
@Json(name = "sender_key")
|
@Json(name = "sender_key")
|
||||||
var senderKey: String? = null,
|
val senderKey: String? = null,
|
||||||
|
|
||||||
@Json(name = "ciphertext")
|
@Json(name = "ciphertext")
|
||||||
var cipherText: Map<String, Any>? = null
|
val cipherText: Map<String, Any>? = null
|
||||||
) : SendToDeviceObject
|
) : SendToDeviceObject
|
||||||
|
@ -25,9 +25,9 @@ import com.squareup.moshi.JsonClass
|
|||||||
internal data class KeyChangesResponse(
|
internal data class KeyChangesResponse(
|
||||||
// list of user ids which have new devices
|
// list of user ids which have new devices
|
||||||
@Json(name = "changed")
|
@Json(name = "changed")
|
||||||
var changed: List<String>? = null,
|
val changed: List<String>? = null,
|
||||||
|
|
||||||
// List of user ids who are no more tracked.
|
// List of user ids who are no more tracked.
|
||||||
@Json(name = "left")
|
@Json(name = "left")
|
||||||
var left: List<String>? = null
|
val left: List<String>? = null
|
||||||
)
|
)
|
||||||
|
@ -24,7 +24,7 @@ import im.vector.matrix.android.internal.crypto.verification.VerificationInfoDon
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class KeyVerificationDone(
|
internal data class KeyVerificationDone(
|
||||||
@Json(name = "transaction_id") override var transactionID: String? = null
|
@Json(name = "transaction_id") override val transactionID: String? = null
|
||||||
) : SendToDeviceObject, VerificationInfoDone {
|
) : SendToDeviceObject, VerificationInfoDone {
|
||||||
|
|
||||||
override fun toSendToDeviceObject() = this
|
override fun toSendToDeviceObject() = this
|
||||||
|
@ -27,7 +27,7 @@ internal data class KeyVerificationRequest(
|
|||||||
@Json(name = "from_device") override val fromDevice: String?,
|
@Json(name = "from_device") override val fromDevice: String?,
|
||||||
@Json(name = "methods") override val methods: List<String>,
|
@Json(name = "methods") override val methods: List<String>,
|
||||||
@Json(name = "timestamp") override val timestamp: Long?,
|
@Json(name = "timestamp") override val timestamp: Long?,
|
||||||
@Json(name = "transaction_id") override var transactionID: String? = null
|
@Json(name = "transaction_id") override val transactionID: String? = null
|
||||||
|
|
||||||
) : SendToDeviceObject, VerificationInfoRequest {
|
) : SendToDeviceObject, VerificationInfoRequest {
|
||||||
|
|
||||||
|
@ -24,16 +24,15 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class KeysClaimBody(
|
internal data class KeysClaimBody(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time (in milliseconds) to wait when downloading keys from remote servers. 10 seconds is the recommended default.
|
* The time (in milliseconds) to wait when downloading keys from remote servers. 10 seconds is the recommended default.
|
||||||
*/
|
*/
|
||||||
@Json(name = "timeout")
|
@Json(name = "timeout")
|
||||||
var timeout: Int? = null,
|
val timeout: Int? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The keys to be claimed. A map from user ID, to a map from device ID to algorithm name.
|
* Required. The keys to be claimed. A map from user ID, to a map from device ID to algorithm name.
|
||||||
*/
|
*/
|
||||||
@Json(name = "one_time_keys")
|
@Json(name = "one_time_keys")
|
||||||
var oneTimeKeys: Map<String, Map<String, String>>
|
val oneTimeKeys: Map<String, Map<String, String>>
|
||||||
)
|
)
|
||||||
|
@ -24,11 +24,10 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class KeysClaimResponse(
|
internal data class KeysClaimResponse(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The requested keys ordered by device by user.
|
* The requested keys ordered by device by user.
|
||||||
* TODO Type does not match spec, should be Map<String, JsonDict>
|
* TODO Type does not match spec, should be Map<String, JsonDict>
|
||||||
*/
|
*/
|
||||||
@Json(name = "one_time_keys")
|
@Json(name = "one_time_keys")
|
||||||
var oneTimeKeys: Map<String, Map<String, Map<String, Map<String, Any>>>>? = null
|
val oneTimeKeys: Map<String, Map<String, Map<String, Map<String, Any>>>>? = null
|
||||||
)
|
)
|
||||||
|
@ -25,12 +25,11 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class KeysQueryBody(
|
internal data class KeysQueryBody(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time (in milliseconds) to wait when downloading keys from remote servers. 10 seconds is the recommended default.
|
* The time (in milliseconds) to wait when downloading keys from remote servers. 10 seconds is the recommended default.
|
||||||
*/
|
*/
|
||||||
@Json(name = "timeout")
|
@Json(name = "timeout")
|
||||||
var timeout: Int? = null,
|
val timeout: Int? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required. The keys to be downloaded.
|
* Required. The keys to be downloaded.
|
||||||
@ -45,6 +44,5 @@ internal data class KeysQueryBody(
|
|||||||
* by the notification in that sync.
|
* by the notification in that sync.
|
||||||
*/
|
*/
|
||||||
@Json(name = "token")
|
@Json(name = "token")
|
||||||
var token: String? = null
|
val token: String? = null
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -23,13 +23,11 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class KeysUploadResponse(
|
internal data class KeysUploadResponse(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The count per algorithm as returned by the home server: a map (algorithm to count).
|
* The count per algorithm as returned by the home server: a map (algorithm to count).
|
||||||
*/
|
*/
|
||||||
@Json(name = "one_time_key_counts")
|
@Json(name = "one_time_key_counts")
|
||||||
var oneTimeKeyCounts: Map<String, Int>? = null
|
val oneTimeKeyCounts: Map<String, Int>? = null
|
||||||
|
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Helper methods to extract information from 'oneTimeKeyCounts'
|
* Helper methods to extract information from 'oneTimeKeyCounts'
|
||||||
|
@ -25,14 +25,14 @@ import com.squareup.moshi.JsonClass
|
|||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RoomKeyRequestBody(
|
data class RoomKeyRequestBody(
|
||||||
@Json(name = "algorithm")
|
@Json(name = "algorithm")
|
||||||
var algorithm: String? = null,
|
val algorithm: String? = null,
|
||||||
|
|
||||||
@Json(name = "room_id")
|
@Json(name = "room_id")
|
||||||
var roomId: String? = null,
|
val roomId: String? = null,
|
||||||
|
|
||||||
@Json(name = "sender_key")
|
@Json(name = "sender_key")
|
||||||
var senderKey: String? = null,
|
val senderKey: String? = null,
|
||||||
|
|
||||||
@Json(name = "session_id")
|
@Json(name = "session_id")
|
||||||
var sessionId: String? = null
|
val sessionId: String? = null
|
||||||
)
|
)
|
||||||
|
@ -15,21 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
package im.vector.matrix.android.internal.crypto.model.rest
|
package im.vector.matrix.android.internal.crypto.model.rest
|
||||||
|
|
||||||
import com.squareup.moshi.Json
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent class representing an room key action request
|
* Interface representing an room key action request
|
||||||
* Note: this class cannot be abstract because of [org.matrix.androidsdk.core.JsonUtils.toRoomKeyShare]
|
* Note: this class cannot be abstract because of [org.matrix.androidsdk.core.JsonUtils.toRoomKeyShare]
|
||||||
*/
|
*/
|
||||||
internal open class RoomKeyShare : SendToDeviceObject {
|
internal interface RoomKeyShare : SendToDeviceObject {
|
||||||
|
|
||||||
var action: String? = null
|
val action: String?
|
||||||
|
|
||||||
@Json(name = "requesting_device_id")
|
val requestingDeviceId: String?
|
||||||
var requestingDeviceId: String? = null
|
|
||||||
|
|
||||||
@Json(name = "request_id")
|
val requestId: String?
|
||||||
var requestId: String? = null
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val ACTION_SHARE_REQUEST = "request"
|
const val ACTION_SHARE_REQUEST = "request"
|
||||||
|
@ -15,14 +15,21 @@
|
|||||||
*/
|
*/
|
||||||
package im.vector.matrix.android.internal.crypto.model.rest
|
package im.vector.matrix.android.internal.crypto.model.rest
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
import im.vector.matrix.android.internal.crypto.model.rest.RoomKeyShare.Companion.ACTION_SHARE_CANCELLATION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing an room key request cancellation content
|
* Class representing a room key request cancellation content
|
||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal class RoomKeyShareCancellation : RoomKeyShare() {
|
internal data class RoomKeyShareCancellation(
|
||||||
init {
|
@Json(name = "action")
|
||||||
action = ACTION_SHARE_CANCELLATION
|
override val action: String? = ACTION_SHARE_CANCELLATION,
|
||||||
}
|
|
||||||
}
|
@Json(name = "requesting_device_id")
|
||||||
|
override val requestingDeviceId: String? = null,
|
||||||
|
|
||||||
|
@Json(name = "request_id")
|
||||||
|
override val requestId: String? = null
|
||||||
|
) : RoomKeyShare
|
||||||
|
@ -16,16 +16,23 @@
|
|||||||
*/
|
*/
|
||||||
package im.vector.matrix.android.internal.crypto.model.rest
|
package im.vector.matrix.android.internal.crypto.model.rest
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing an room key request content
|
* Class representing a room key request content
|
||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal class RoomKeyShareRequest : RoomKeyShare() {
|
internal data class RoomKeyShareRequest(
|
||||||
var body: RoomKeyRequestBody? = null
|
@Json(name = "action")
|
||||||
|
override val action: String? = RoomKeyShare.ACTION_SHARE_REQUEST,
|
||||||
|
|
||||||
init {
|
@Json(name = "requesting_device_id")
|
||||||
action = ACTION_SHARE_REQUEST
|
override val requestingDeviceId: String? = null,
|
||||||
}
|
|
||||||
}
|
@Json(name = "request_id")
|
||||||
|
override val requestId: String? = null,
|
||||||
|
|
||||||
|
@Json(name = "body")
|
||||||
|
val body: RoomKeyRequestBody? = null
|
||||||
|
) : RoomKeyShare
|
||||||
|
@ -25,5 +25,5 @@ internal data class UpdateDeviceInfoBody(
|
|||||||
* The new display name for this device. If not given, the display name is unchanged.
|
* The new display name for this device. If not given, the display name is unchanged.
|
||||||
*/
|
*/
|
||||||
@Json(name = "display_name")
|
@Json(name = "display_name")
|
||||||
var displayName: String? = null
|
val displayName: String? = null
|
||||||
)
|
)
|
||||||
|
@ -20,6 +20,7 @@ package im.vector.matrix.android.internal.crypto.store
|
|||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import im.vector.matrix.android.api.session.crypto.crosssigning.MXCrossSigningInfo
|
import im.vector.matrix.android.api.session.crypto.crosssigning.MXCrossSigningInfo
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
|
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequestCommon
|
||||||
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequest
|
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequest
|
||||||
import im.vector.matrix.android.internal.crypto.NewSessionListener
|
import im.vector.matrix.android.internal.crypto.NewSessionListener
|
||||||
import im.vector.matrix.android.internal.crypto.OutgoingRoomKeyRequest
|
import im.vector.matrix.android.internal.crypto.OutgoingRoomKeyRequest
|
||||||
@ -382,7 +383,7 @@ internal interface IMXCryptoStore {
|
|||||||
*
|
*
|
||||||
* @param incomingRoomKeyRequest the incoming key request
|
* @param incomingRoomKeyRequest the incoming key request
|
||||||
*/
|
*/
|
||||||
fun deleteIncomingRoomKeyRequest(incomingRoomKeyRequest: IncomingRoomKeyRequest)
|
fun deleteIncomingRoomKeyRequest(incomingRoomKeyRequest: IncomingRoomKeyRequestCommon)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search an IncomingRoomKeyRequest
|
* Search an IncomingRoomKeyRequest
|
||||||
|
@ -23,6 +23,7 @@ import im.vector.matrix.android.api.auth.data.Credentials
|
|||||||
import im.vector.matrix.android.api.session.crypto.crosssigning.MXCrossSigningInfo
|
import im.vector.matrix.android.api.session.crypto.crosssigning.MXCrossSigningInfo
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import im.vector.matrix.android.api.util.toOptional
|
import im.vector.matrix.android.api.util.toOptional
|
||||||
|
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequestCommon
|
||||||
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequest
|
import im.vector.matrix.android.internal.crypto.IncomingRoomKeyRequest
|
||||||
import im.vector.matrix.android.internal.crypto.NewSessionListener
|
import im.vector.matrix.android.internal.crypto.NewSessionListener
|
||||||
import im.vector.matrix.android.internal.crypto.OutgoingRoomKeyRequest
|
import im.vector.matrix.android.internal.crypto.OutgoingRoomKeyRequest
|
||||||
@ -888,7 +889,7 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun deleteIncomingRoomKeyRequest(incomingRoomKeyRequest: IncomingRoomKeyRequest) {
|
override fun deleteIncomingRoomKeyRequest(incomingRoomKeyRequest: IncomingRoomKeyRequestCommon) {
|
||||||
doRealmTransaction(realmConfiguration) {
|
doRealmTransaction(realmConfiguration) {
|
||||||
it.where<IncomingRoomKeyRequestEntity>()
|
it.where<IncomingRoomKeyRequestEntity>()
|
||||||
.equalTo(IncomingRoomKeyRequestEntityFields.USER_ID, incomingRoomKeyRequest.userId)
|
.equalTo(IncomingRoomKeyRequestEntityFields.USER_ID, incomingRoomKeyRequest.userId)
|
||||||
|
@ -32,17 +32,17 @@ internal open class IncomingRoomKeyRequestEntity(
|
|||||||
) : RealmObject() {
|
) : RealmObject() {
|
||||||
|
|
||||||
fun toIncomingRoomKeyRequest(): IncomingRoomKeyRequest {
|
fun toIncomingRoomKeyRequest(): IncomingRoomKeyRequest {
|
||||||
return IncomingRoomKeyRequest().also {
|
return IncomingRoomKeyRequest(
|
||||||
it.requestId = requestId
|
requestId = requestId,
|
||||||
it.userId = userId
|
userId = userId,
|
||||||
it.deviceId = deviceId
|
deviceId = deviceId,
|
||||||
it.requestBody = RoomKeyRequestBody().apply {
|
requestBody = RoomKeyRequestBody(
|
||||||
algorithm = requestBodyAlgorithm
|
algorithm = requestBodyAlgorithm,
|
||||||
roomId = requestBodyRoomId
|
roomId = requestBodyRoomId,
|
||||||
senderKey = requestBodySenderKey
|
senderKey = requestBodySenderKey,
|
||||||
sessionId = requestBodySessionId
|
sessionId = requestBodySessionId
|
||||||
}
|
)
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun putRequestBody(requestBody: RoomKeyRequestBody?) {
|
fun putRequestBody(requestBody: RoomKeyRequestBody?) {
|
||||||
|
@ -43,12 +43,12 @@ internal open class OutgoingRoomKeyRequestEntity(
|
|||||||
fun toOutgoingRoomKeyRequest(): OutgoingRoomKeyRequest {
|
fun toOutgoingRoomKeyRequest(): OutgoingRoomKeyRequest {
|
||||||
val cancellationTxnId = this.cancellationTxnId
|
val cancellationTxnId = this.cancellationTxnId
|
||||||
return OutgoingRoomKeyRequest(
|
return OutgoingRoomKeyRequest(
|
||||||
RoomKeyRequestBody().apply {
|
RoomKeyRequestBody(
|
||||||
algorithm = requestBodyAlgorithm
|
algorithm = requestBodyAlgorithm,
|
||||||
roomId = requestBodyRoomId
|
roomId = requestBodyRoomId,
|
||||||
senderKey = requestBodySenderKey
|
senderKey = requestBodySenderKey,
|
||||||
sessionId = requestBodySessionId
|
sessionId = requestBodySessionId
|
||||||
},
|
),
|
||||||
getRecipients()!!,
|
getRecipients()!!,
|
||||||
requestId!!,
|
requestId!!,
|
||||||
OutgoingRoomKeyRequest.RequestState.from(state)
|
OutgoingRoomKeyRequest.RequestState.from(state)
|
||||||
|
@ -29,7 +29,8 @@ internal interface DownloadKeysForUsersTask : Task<DownloadKeysForUsersTask.Para
|
|||||||
// the list of users to get keys for.
|
// the list of users to get keys for.
|
||||||
val userIds: List<String>?,
|
val userIds: List<String>?,
|
||||||
// the up-to token
|
// the up-to token
|
||||||
val token: String?)
|
val token: String?
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DefaultDownloadKeysForUsers @Inject constructor(
|
internal class DefaultDownloadKeysForUsers @Inject constructor(
|
||||||
@ -41,13 +42,10 @@ internal class DefaultDownloadKeysForUsers @Inject constructor(
|
|||||||
val downloadQuery = params.userIds?.associateWith { emptyMap<String, Any>() }.orEmpty()
|
val downloadQuery = params.userIds?.associateWith { emptyMap<String, Any>() }.orEmpty()
|
||||||
|
|
||||||
val body = KeysQueryBody(
|
val body = KeysQueryBody(
|
||||||
deviceKeys = downloadQuery
|
deviceKeys = downloadQuery,
|
||||||
|
token = params.token?.takeIf { it.isNotEmpty() }
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!params.token.isNullOrEmpty()) {
|
|
||||||
body.token = params.token
|
|
||||||
}
|
|
||||||
|
|
||||||
return executeRequest(eventBus) {
|
return executeRequest(eventBus) {
|
||||||
apiCall = cryptoApi.downloadKeysForUsers(body)
|
apiCall = cryptoApi.downloadKeysForUsers(body)
|
||||||
}
|
}
|
||||||
|
@ -24,13 +24,13 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class Filter(
|
data class Filter(
|
||||||
@Json(name = "limit") var limit: Int? = null,
|
@Json(name = "limit") val limit: Int? = null,
|
||||||
@Json(name = "senders") var senders: MutableList<String>? = null,
|
@Json(name = "senders") val senders: List<String>? = null,
|
||||||
@Json(name = "not_senders") var notSenders: MutableList<String>? = null,
|
@Json(name = "not_senders") val notSenders: List<String>? = null,
|
||||||
@Json(name = "types") var types: MutableList<String>? = null,
|
@Json(name = "types") val types: List<String>? = null,
|
||||||
@Json(name = "not_types") var notTypes: MutableList<String>? = null,
|
@Json(name = "not_types") val notTypes: List<String>? = null,
|
||||||
@Json(name = "rooms") var rooms: MutableList<String>? = null,
|
@Json(name = "rooms") val rooms: List<String>? = null,
|
||||||
@Json(name = "not_rooms") var notRooms: MutableList<String>? = null
|
@Json(name = "not_rooms") val notRooms: List<String>? = null
|
||||||
) {
|
) {
|
||||||
fun hasData(): Boolean {
|
fun hasData(): Boolean {
|
||||||
return (limit != null
|
return (limit != null
|
||||||
|
@ -26,11 +26,11 @@ import im.vector.matrix.android.internal.di.MoshiProvider
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class FilterBody(
|
internal data class FilterBody(
|
||||||
@Json(name = "event_fields") var eventFields: List<String>? = null,
|
@Json(name = "event_fields") val eventFields: List<String>? = null,
|
||||||
@Json(name = "event_format") var eventFormat: String? = null,
|
@Json(name = "event_format") val eventFormat: String? = null,
|
||||||
@Json(name = "presence") var presence: Filter? = null,
|
@Json(name = "presence") val presence: Filter? = null,
|
||||||
@Json(name = "account_data") var accountData: Filter? = null,
|
@Json(name = "account_data") val accountData: Filter? = null,
|
||||||
@Json(name = "room") var room: RoomFilter? = null
|
@Json(name = "room") val room: RoomFilter? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun toJSONString(): String {
|
fun toJSONString(): String {
|
||||||
|
@ -21,32 +21,30 @@ import im.vector.matrix.android.api.session.events.model.EventType
|
|||||||
internal object FilterFactory {
|
internal object FilterFactory {
|
||||||
|
|
||||||
fun createDefaultFilterBody(): FilterBody {
|
fun createDefaultFilterBody(): FilterBody {
|
||||||
val filterBody = FilterBody()
|
return FilterUtil.enableLazyLoading(FilterBody(), true)
|
||||||
FilterUtil.enableLazyLoading(filterBody, true)
|
|
||||||
return filterBody
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createRiotFilterBody(): FilterBody {
|
fun createRiotFilterBody(): FilterBody {
|
||||||
val filterBody = FilterBody()
|
return FilterBody(
|
||||||
filterBody.room = RoomFilter().apply {
|
room = RoomFilter(
|
||||||
timeline = createRiotTimelineFilter()
|
timeline = createRiotTimelineFilter(),
|
||||||
state = createRiotStateFilter()
|
state = createRiotStateFilter()
|
||||||
}
|
)
|
||||||
return filterBody
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createDefaultRoomFilter(): RoomEventFilter {
|
fun createDefaultRoomFilter(): RoomEventFilter {
|
||||||
return RoomEventFilter().apply {
|
return RoomEventFilter(
|
||||||
lazyLoadMembers = true
|
lazyLoadMembers = true
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createRiotRoomFilter(): RoomEventFilter {
|
fun createRiotRoomFilter(): RoomEventFilter {
|
||||||
return RoomEventFilter().apply {
|
return RoomEventFilter(
|
||||||
lazyLoadMembers = true
|
lazyLoadMembers = true
|
||||||
// TODO Enable this for optimization
|
// TODO Enable this for optimization
|
||||||
// types = (listOfSupportedEventTypes + listOfSupportedStateEventTypes).toMutableList()
|
// types = (listOfSupportedEventTypes + listOfSupportedStateEventTypes).toMutableList()
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createRiotTimelineFilter(): RoomEventFilter {
|
private fun createRiotTimelineFilter(): RoomEventFilter {
|
||||||
@ -57,9 +55,9 @@ internal object FilterFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun createRiotStateFilter(): RoomEventFilter {
|
private fun createRiotStateFilter(): RoomEventFilter {
|
||||||
return RoomEventFilter().apply {
|
return RoomEventFilter(
|
||||||
lazyLoadMembers = true
|
lazyLoadMembers = true
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get only managed types by Riot
|
// Get only managed types by Riot
|
||||||
|
@ -24,5 +24,5 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class FilterResponse(
|
data class FilterResponse(
|
||||||
@Json(name = "filter_id") var filterId: String
|
@Json(name = "filter_id") val filterId: String
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,6 @@ internal object FilterUtil {
|
|||||||
/**
|
/**
|
||||||
* Patch the filterBody to enable or disable the data save mode
|
* Patch the filterBody to enable or disable the data save mode
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* If data save mode is on, FilterBody will contains
|
* If data save mode is on, FilterBody will contains
|
||||||
* FIXME New expected filter:
|
* FIXME New expected filter:
|
||||||
* "{\"room\": {\"ephemeral\": {\"notTypes\": [\"m.typing\"]}}, \"presence\":{\"notTypes\": [\"*\"]}}"
|
* "{\"room\": {\"ephemeral\": {\"notTypes\": [\"m.typing\"]}}, \"presence\":{\"notTypes\": [\"*\"]}}"
|
||||||
@ -29,6 +28,7 @@ internal object FilterUtil {
|
|||||||
* @param filterBody filterBody to patch
|
* @param filterBody filterBody to patch
|
||||||
* @param useDataSaveMode true to enable data save mode
|
* @param useDataSaveMode true to enable data save mode
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
fun enableDataSaveMode(filterBody: FilterBody, useDataSaveMode: Boolean) {
|
fun enableDataSaveMode(filterBody: FilterBody, useDataSaveMode: Boolean) {
|
||||||
if (useDataSaveMode) {
|
if (useDataSaveMode) {
|
||||||
// Enable data save mode
|
// Enable data save mode
|
||||||
@ -79,9 +79,10 @@ internal object FilterUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Patch the filterBody to enable or disable the lazy loading
|
* Compute a new filterBody to enable or disable the lazy loading
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* If lazy loading is on, the filterBody will looks like
|
* If lazy loading is on, the filterBody will looks like
|
||||||
@ -90,29 +91,23 @@ internal object FilterUtil {
|
|||||||
* @param filterBody filterBody to patch
|
* @param filterBody filterBody to patch
|
||||||
* @param useLazyLoading true to enable lazy loading
|
* @param useLazyLoading true to enable lazy loading
|
||||||
*/
|
*/
|
||||||
fun enableLazyLoading(filterBody: FilterBody, useLazyLoading: Boolean) {
|
fun enableLazyLoading(filterBody: FilterBody, useLazyLoading: Boolean): FilterBody {
|
||||||
if (useLazyLoading) {
|
if (useLazyLoading) {
|
||||||
// Enable lazy loading
|
// Enable lazy loading
|
||||||
if (filterBody.room == null) {
|
return filterBody.copy(
|
||||||
filterBody.room = RoomFilter()
|
room = filterBody.room?.copy(
|
||||||
}
|
state = filterBody.room.state?.copy(lazyLoadMembers = true)
|
||||||
if (filterBody.room!!.state == null) {
|
?: RoomEventFilter(lazyLoadMembers = true)
|
||||||
filterBody.room!!.state = RoomEventFilter()
|
)
|
||||||
}
|
?: RoomFilter(state = RoomEventFilter(lazyLoadMembers = true))
|
||||||
|
)
|
||||||
filterBody.room!!.state!!.lazyLoadMembers = true
|
|
||||||
} else {
|
} else {
|
||||||
if (filterBody.room != null && filterBody.room!!.state != null) {
|
val newRoomEventFilter = filterBody.room?.state?.copy(lazyLoadMembers = null)?.takeIf { it.hasData() }
|
||||||
filterBody.room!!.state!!.lazyLoadMembers = null
|
val newRoomFilter = filterBody.room?.copy(state = newRoomEventFilter)?.takeIf { it.hasData() }
|
||||||
|
|
||||||
if (!filterBody.room!!.state!!.hasData()) {
|
return filterBody.copy(
|
||||||
filterBody.room!!.state = null
|
room = newRoomFilter
|
||||||
}
|
)
|
||||||
|
|
||||||
if (!filterBody.room!!.hasData()) {
|
|
||||||
filterBody.room = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,14 +26,14 @@ import im.vector.matrix.android.internal.di.MoshiProvider
|
|||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RoomEventFilter(
|
data class RoomEventFilter(
|
||||||
@Json(name = "limit") var limit: Int? = null,
|
@Json(name = "limit") var limit: Int? = null,
|
||||||
@Json(name = "not_senders") var notSenders: MutableList<String>? = null,
|
@Json(name = "not_senders") val notSenders: List<String>? = null,
|
||||||
@Json(name = "not_types") var notTypes: MutableList<String>? = null,
|
@Json(name = "not_types") val notTypes: List<String>? = null,
|
||||||
@Json(name = "senders") var senders: MutableList<String>? = null,
|
@Json(name = "senders") val senders: List<String>? = null,
|
||||||
@Json(name = "types") var types: MutableList<String>? = null,
|
@Json(name = "types") val types: List<String>? = null,
|
||||||
@Json(name = "rooms") var rooms: MutableList<String>? = null,
|
@Json(name = "rooms") val rooms: List<String>? = null,
|
||||||
@Json(name = "not_rooms") var notRooms: List<String>? = null,
|
@Json(name = "not_rooms") val notRooms: List<String>? = null,
|
||||||
@Json(name = "contains_url") var containsUrl: Boolean? = null,
|
@Json(name = "contains_url") val containsUrl: Boolean? = null,
|
||||||
@Json(name = "lazy_load_members") var lazyLoadMembers: Boolean? = null
|
@Json(name = "lazy_load_members") val lazyLoadMembers: Boolean? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun toJSONString(): String {
|
fun toJSONString(): String {
|
||||||
|
@ -24,13 +24,13 @@ import com.squareup.moshi.JsonClass
|
|||||||
*/
|
*/
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RoomFilter(
|
data class RoomFilter(
|
||||||
@Json(name = "not_rooms") var notRooms: List<String>? = null,
|
@Json(name = "not_rooms") val notRooms: List<String>? = null,
|
||||||
@Json(name = "rooms") var rooms: List<String>? = null,
|
@Json(name = "rooms") val rooms: List<String>? = null,
|
||||||
@Json(name = "ephemeral") var ephemeral: RoomEventFilter? = null,
|
@Json(name = "ephemeral") val ephemeral: RoomEventFilter? = null,
|
||||||
@Json(name = "include_leave") var includeLeave: Boolean? = null,
|
@Json(name = "include_leave") val includeLeave: Boolean? = null,
|
||||||
@Json(name = "state") var state: RoomEventFilter? = null,
|
@Json(name = "state") val state: RoomEventFilter? = null,
|
||||||
@Json(name = "timeline") var timeline: RoomEventFilter? = null,
|
@Json(name = "timeline") val timeline: RoomEventFilter? = null,
|
||||||
@Json(name = "account_data") var accountData: RoomEventFilter? = null
|
@Json(name = "account_data") val accountData: RoomEventFilter? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun hasData(): Boolean {
|
fun hasData(): Boolean {
|
||||||
|
@ -24,10 +24,10 @@ internal data class GroupSyncProfile(
|
|||||||
/**
|
/**
|
||||||
* The name of the group, if any. May be nil.
|
* The name of the group, if any. May be nil.
|
||||||
*/
|
*/
|
||||||
@Json(name = "name") var name: String? = null,
|
@Json(name = "name") val name: String? = null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The URL for the group's avatar. May be nil.
|
* The URL for the group's avatar. May be nil.
|
||||||
*/
|
*/
|
||||||
@Json(name = "avatar_url") var avatarUrl: String? = null
|
@Json(name = "avatar_url") val avatarUrl: String? = null
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user