Cleanup var -> val

This commit is contained in:
Benoit Marty 2020-02-21 15:05:43 +01:00
parent d6434654e2
commit ccfa59ad31
62 changed files with 529 additions and 429 deletions

View File

@ -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()
} )
} }
} }

View File

@ -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

View File

@ -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

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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,

View File

@ -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)
} }

View File

@ -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()
} }

View File

@ -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
)
}
} }
} }

View File

@ -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?
}

View File

@ -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}")
} }
} }

View File

@ -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
) )

View File

@ -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() {

View File

@ -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)

View File

@ -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

View File

@ -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) {

View File

@ -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 {

View File

@ -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 = ""
}

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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()
) )

View File

@ -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

View File

@ -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()
) )

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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

View File

@ -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
) )

View File

@ -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

View File

@ -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
} }

View File

@ -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

View File

@ -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
) )

View File

@ -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

View File

@ -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 {

View File

@ -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>>
) )

View File

@ -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
) )

View File

@ -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
) )

View File

@ -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'

View File

@ -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
) )

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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
) )

View File

@ -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

View File

@ -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)

View File

@ -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?) {

View File

@ -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)

View File

@ -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)
} }

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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
) )

View File

@ -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
}
}
} }
} }
} }

View File

@ -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 {

View File

@ -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 {

View File

@ -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
) )