Changes code style method parameters new line around parentheses to true

This commit is contained in:
ericdecanini 2022-05-23 12:30:42 +02:00
parent 98999c754f
commit 3f3662e605
539 changed files with 5638 additions and 3997 deletions

View file

@ -810,8 +810,8 @@ ij_kotlin_line_comment_add_space = false
ij_kotlin_line_comment_at_first_column = true
ij_kotlin_method_annotation_wrap = split_into_lines
ij_kotlin_method_call_chain_wrap = off
ij_kotlin_method_parameters_new_line_after_left_paren = false
ij_kotlin_method_parameters_right_paren_on_new_line = false
ij_kotlin_method_parameters_new_line_after_left_paren = true
ij_kotlin_method_parameters_right_paren_on_new_line = true
ij_kotlin_method_parameters_wrap = off
ij_kotlin_name_count_to_use_star_import = 2147483647
ij_kotlin_name_count_to_use_star_import_for_members = 2147483647

View file

@ -216,7 +216,8 @@ class CommonTestHelper(context: Context) {
message: String,
numberOfMessages: Int,
rootThreadEventId: String,
timeout: Long = TestConstants.timeOutMillis): List<TimelineEvent> {
timeout: Long = TestConstants.timeOutMillis
): List<TimelineEvent> {
val timeline = room.timelineService().createTimeline(null, TimelineSettings(10))
timeline.start()
val sentEvents = sendTextMessagesBatched(timeline, room, message, numberOfMessages, timeout, rootThreadEventId)
@ -236,9 +237,11 @@ class CommonTestHelper(context: Context) {
* @param testParams test params about the session
* @return the session associated with the newly created account
*/
private fun createAccount(userNamePrefix: String,
private fun createAccount(
userNamePrefix: String,
password: String,
testParams: SessionTestParams): Session {
testParams: SessionTestParams
): Session {
val session = createAccountAndSync(
userNamePrefix + "_" + accountNumber++ + "_" + UUID.randomUUID(),
password,
@ -256,9 +259,11 @@ class CommonTestHelper(context: Context) {
* @param testParams test params about the session
* @return the session associated with the existing account
*/
fun logIntoAccount(userId: String,
fun logIntoAccount(
userId: String,
password: String,
testParams: SessionTestParams): Session {
testParams: SessionTestParams
): Session {
val session = logAccountAndSync(userId, password, testParams)
assertNotNull(session)
return session
@ -271,9 +276,11 @@ class CommonTestHelper(context: Context) {
* @param password the password
* @param sessionTestParams parameters for the test
*/
private fun createAccountAndSync(userName: String,
private fun createAccountAndSync(
userName: String,
password: String,
sessionTestParams: SessionTestParams): Session {
sessionTestParams: SessionTestParams
): Session {
val hs = createHomeServerConfig()
runBlockingTest {
@ -309,9 +316,11 @@ class CommonTestHelper(context: Context) {
* @param password the password
* @param sessionTestParams session test params
*/
private fun logAccountAndSync(userName: String,
private fun logAccountAndSync(
userName: String,
password: String,
sessionTestParams: SessionTestParams): Session {
sessionTestParams: SessionTestParams
): Session {
val hs = createHomeServerConfig()
runBlockingTest {
@ -337,8 +346,10 @@ class CommonTestHelper(context: Context) {
* @param userName the account username
* @param password the password
*/
fun logAccountWithError(userName: String,
password: String): Throwable {
fun logAccountWithError(
userName: String,
password: String
): Throwable {
val hs = createHomeServerConfig()
runBlockingTest {

View file

@ -18,8 +18,10 @@ package org.matrix.android.sdk.common
import org.matrix.android.sdk.api.session.Session
data class CryptoTestData(val roomId: String,
val sessions: List<Session>) {
data class CryptoTestData(
val roomId: String,
val sessions: List<Session>
) {
val firstSession: Session
get() = sessions.first()

View file

@ -73,9 +73,11 @@ class MockOkHttpInterceptor : TestInterceptor {
/**
* Simple rule that reply with the given body for any request that matches the match param
*/
class SimpleRule(match: String,
class SimpleRule(
match: String,
private val code: Int = HttpsURLConnection.HTTP_OK,
private val body: String = "{}") : Rule(match) {
private val body: String = "{}"
) : Rule(match) {
override fun process(originalRequest: Request): Response? {
return Response.Builder()

View file

@ -27,8 +27,10 @@ import java.util.concurrent.CountDownLatch
* @param onlySuccessful true to fail if an error occurs. This is the default behavior
* @param <T>
*/
open class TestMatrixCallback<T>(private val countDownLatch: CountDownLatch,
private val onlySuccessful: Boolean = true) : MatrixCallback<T> {
open class TestMatrixCallback<T>(
private val countDownLatch: CountDownLatch,
private val onlySuccessful: Boolean = true
) : MatrixCallback<T> {
@CallSuper
override fun onSuccess(data: T) {

View file

@ -47,7 +47,9 @@ internal interface TestMatrixComponent : MatrixComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context,
@BindsInstance matrixConfiguration: MatrixConfiguration): TestMatrixComponent
fun create(
@BindsInstance context: Context,
@BindsInstance matrixConfiguration: MatrixConfiguration
): TestMatrixComponent
}
}

View file

@ -83,7 +83,8 @@ class ExportEncryptionTest {
@Test
fun checkExportDecrypt1() {
val password = "password"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAXNhbHRzYWx0c2FsdHNhbHSIiIiIiIiIiIiIiIiIiIiIAAAACmIRUW2OjZ3L2l6j9h0lHlV3M2dx\n" + "cissyYBxjsfsAndErh065A8=\n-----END MEGOLM SESSION DATA-----"
val input =
"-----BEGIN MEGOLM SESSION DATA-----\nAXNhbHRzYWx0c2FsdHNhbHSIiIiIiIiIiIiIiIiIiIiIAAAACmIRUW2OjZ3L2l6j9h0lHlV3M2dx\n" + "cissyYBxjsfsAndErh065A8=\n-----END MEGOLM SESSION DATA-----"
val expectedString = "plain"
var decodedString: String? = null
@ -103,7 +104,8 @@ class ExportEncryptionTest {
@Test
fun checkExportDecrypt2() {
val password = "betterpassword"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAW1vcmVzYWx0bW9yZXNhbHT//////////wAAAAAAAAAAAAAD6KyBpe1Niv5M5NPm4ZATsJo5nghk\n" + "KYu63a0YQ5DRhUWEKk7CcMkrKnAUiZny\n-----END MEGOLM SESSION DATA-----"
val input =
"-----BEGIN MEGOLM SESSION DATA-----\nAW1vcmVzYWx0bW9yZXNhbHT//////////wAAAAAAAAAAAAAD6KyBpe1Niv5M5NPm4ZATsJo5nghk\n" + "KYu63a0YQ5DRhUWEKk7CcMkrKnAUiZny\n-----END MEGOLM SESSION DATA-----"
val expectedString = "Hello, World"
var decodedString: String? = null
@ -123,7 +125,8 @@ class ExportEncryptionTest {
@Test
fun checkExportDecrypt3() {
val password = "SWORDFISH"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAXllc3NhbHR5Z29vZG5lc3P//////////wAAAAAAAAAAAAAD6OIW+Je7gwvjd4kYrb+49gKCfExw\n" + "MgJBMD4mrhLkmgAngwR1pHjbWXaoGybtiAYr0moQ93GrBQsCzPbvl82rZhaXO3iH5uHo/RCEpOqp\nPgg29363BGR+/Ripq/VCLKGNbw==\n-----END MEGOLM SESSION DATA-----"
val input =
"-----BEGIN MEGOLM SESSION DATA-----\nAXllc3NhbHR5Z29vZG5lc3P//////////wAAAAAAAAAAAAAD6OIW+Je7gwvjd4kYrb+49gKCfExw\n" + "MgJBMD4mrhLkmgAngwR1pHjbWXaoGybtiAYr0moQ93GrBQsCzPbvl82rZhaXO3iH5uHo/RCEpOqp\nPgg29363BGR+/Ripq/VCLKGNbw==\n-----END MEGOLM SESSION DATA-----"
val expectedString = "alphanumericallyalphanumericallyalphanumericallyalphanumerically"
var decodedString: String? = null
@ -202,7 +205,8 @@ class ExportEncryptionTest {
@Test
fun checkExportEncrypt4() {
val password = "passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword" + "passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword"
val password =
"passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword" + "passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword"
val expectedString = "alphanumericallyalphanumericallyalphanumericallyalphanumerically"
var decodedString: String? = null

View file

@ -33,7 +33,8 @@ import java.util.concurrent.CountDownLatch
internal class KeysBackupTestHelper(
private val testHelper: CommonTestHelper,
private val cryptoTestHelper: CryptoTestHelper) {
private val cryptoTestHelper: CryptoTestHelper
) {
fun waitForKeybackUpBatching() {
Thread.sleep(400)
@ -96,8 +97,10 @@ internal class KeysBackupTestHelper(
)
}
fun prepareAndCreateKeysBackupData(keysBackup: KeysBackupService,
password: String? = null): PrepareKeysBackupDataResult {
fun prepareAndCreateKeysBackupData(
keysBackup: KeysBackupService,
password: String? = null
): PrepareKeysBackupDataResult {
val stateObserver = StateObserver(keysBackup)
val megolmBackupCreationInfo = testHelper.doSync<MegolmBackupCreationInfo> {
@ -169,9 +172,11 @@ internal class KeysBackupTestHelper(
* - The new device must have the same count of megolm keys
* - Alice must have the same keys on both devices
*/
fun checkRestoreSuccess(testData: KeysBackupScenarioData,
fun checkRestoreSuccess(
testData: KeysBackupScenarioData,
total: Int,
imported: Int) {
imported: Int
) {
// - Imported keys number must be correct
Assert.assertEquals(testData.aliceKeys.size, total)
Assert.assertEquals(total, imported)

View file

@ -18,5 +18,7 @@ package org.matrix.android.sdk.internal.crypto.keysbackup
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
data class PrepareKeysBackupDataResult(val megolmBackupCreationInfo: MegolmBackupCreationInfo,
val version: String)
data class PrepareKeysBackupDataResult(
val megolmBackupCreationInfo: MegolmBackupCreationInfo,
val version: String
)

View file

@ -27,9 +27,11 @@ import java.util.concurrent.CountDownLatch
* This class observe the state change of a KeysBackup object and provide a method to check the several state change
* It checks all state transitions and detected forbidden transition
*/
internal class StateObserver(private val keysBackup: KeysBackupService,
internal class StateObserver(
private val keysBackup: KeysBackupService,
private val latch: CountDownLatch? = null,
private val expectedStateChange: Int = -1) : KeysBackupStateListener {
private val expectedStateChange: Int = -1
) : KeysBackupStateListener {
private val allowedStateTransitions = listOf(
KeysBackupState.BackingUp to KeysBackupState.ReadyToBackUp,

View file

@ -281,14 +281,16 @@ class SASTest : InstrumentedTest {
cryptoTestData.cleanUp(testHelper)
}
private fun fakeBobStart(bobSession: Session,
private fun fakeBobStart(
bobSession: Session,
aliceUserID: String?,
aliceDevice: String?,
tid: String,
protocols: List<String> = SASDefaultVerificationTransaction.KNOWN_AGREEMENT_PROTOCOLS,
hashes: List<String> = SASDefaultVerificationTransaction.KNOWN_HASHES,
mac: List<String> = SASDefaultVerificationTransaction.KNOWN_MACS,
codes: List<String> = SASDefaultVerificationTransaction.KNOWN_SHORT_CODES) {
codes: List<String> = SASDefaultVerificationTransaction.KNOWN_SHORT_CODES
) {
val startMessage = KeyVerificationStart(
fromDevice = bobSession.cryptoService().getMyDevice().deviceId,
method = VerificationMethod.SAS.toValue(),

View file

@ -151,10 +151,12 @@ class VerificationTest : InstrumentedTest {
// TODO Add tests without SAS
private fun doTest(aliceSupportedMethods: List<VerificationMethod>,
private fun doTest(
aliceSupportedMethods: List<VerificationMethod>,
bobSupportedMethods: List<VerificationMethod>,
expectedResultForAlice: ExpectedResult,
expectedResultForBob: ExpectedResult) {
expectedResultForBob: ExpectedResult
) {
val testHelper = CommonTestHelper(context())
val cryptoTestHelper = CryptoTestHelper(testHelper)
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()

View file

@ -289,9 +289,11 @@ class MarkdownParserTest : InstrumentedTest {
markdownParser.parse(text).expect(text, null)
}
private fun testType(name: String,
private fun testType(
name: String,
markdownPattern: String,
htmlExpectedTag: String) {
htmlExpectedTag: String
) {
// Test simple case
"$markdownPattern$name$markdownPattern"
.let {
@ -376,10 +378,12 @@ class MarkdownParserTest : InstrumentedTest {
}
}
private fun testTypeNewLines(name: String,
private fun testTypeNewLines(
name: String,
markdownPattern: String,
htmlExpectedTag: String,
softBreak: String = "<br />") {
softBreak: String = "<br />"
) {
// With new line inside the block
"$markdownPattern$name\n$name$markdownPattern"
.let {

View file

@ -154,9 +154,11 @@ internal class ChunkEntityTest : InstrumentedTest {
}
}
private fun ChunkEntity.addAll(roomId: String,
private fun ChunkEntity.addAll(
roomId: String,
events: List<Event>,
direction: PaginationDirection) {
direction: PaginationDirection
) {
events.forEach { event ->
val fakeEvent = event.toEntity(roomId, SendState.SYNCED, clock.epochMillis()).let {
realm.copyToRealm(it)

View file

@ -19,7 +19,8 @@ package org.matrix.android.sdk.session.room.timeline
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.internal.session.room.timeline.TokenChunkEvent
internal data class FakeTokenChunkEvent(override val start: String?,
internal data class FakeTokenChunkEvent(
override val start: String?,
override val end: String?,
override val events: List<Event> = emptyList(),
override val stateEvents: List<Event> = emptyList()

View file

@ -41,7 +41,8 @@ object RoomDataHelper {
}
}
private fun createFakeEvent(type: String,
private fun createFakeEvent(
type: String,
content: Content? = null,
prevContent: Content? = null,
sender: String = FAKE_TEST_SENDER,

View file

@ -390,7 +390,8 @@ class SpaceHierarchyTest : InstrumentedTest {
val roomIds: List<String>
)
private fun createPublicSpace(session: Session,
private fun createPublicSpace(
session: Session,
spaceName: String,
childInfo: List<Triple<String, Boolean, Boolean?>>
/** Name, auto-join, canonical*/
@ -418,7 +419,8 @@ class SpaceHierarchyTest : InstrumentedTest {
return TestSpaceCreationResult(spaceId, roomIds)
}
private fun createPrivateSpace(session: Session,
private fun createPrivateSpace(
session: Session,
spaceName: String,
childInfo: List<Triple<String, Boolean, Boolean?>>
/** Name, auto-join, canonical*/

View file

@ -93,14 +93,18 @@ interface AuthenticationService {
/**
* Create a session after a SSO successful login.
*/
suspend fun createSessionFromSso(homeServerConnectionConfig: HomeServerConnectionConfig,
credentials: Credentials): Session
suspend fun createSessionFromSso(
homeServerConnectionConfig: HomeServerConnectionConfig,
credentials: Credentials
): Session
/**
* Perform a wellknown request, using the domain from the matrixId.
*/
suspend fun getWellKnownData(matrixId: String,
homeServerConnectionConfig: HomeServerConnectionConfig?): WellknownResult
suspend fun getWellKnownData(
matrixId: String,
homeServerConnectionConfig: HomeServerConnectionConfig?
): WellknownResult
/**
* Authenticate with a matrixId and a password.
@ -111,9 +115,11 @@ interface AuthenticationService {
* @param initialDeviceName the initial device name
* @param deviceId the device id, optional. If not provided or null, the server will generate one.
*/
suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
suspend fun directAuthentication(
homeServerConnectionConfig: HomeServerConnectionConfig,
matrixId: String,
password: String,
initialDeviceName: String,
deviceId: String? = null): Session
deviceId: String? = null
): Session
}

View file

@ -41,8 +41,10 @@ import org.matrix.android.sdk.api.auth.registration.TermPolicies
* @param userLanguage the user language
* @param defaultLanguage the default language to use if the user language is not found for a policy in registrationFlowResponse
*/
fun TermPolicies.toLocalizedLoginTerms(userLanguage: String,
defaultLanguage: String = "en"): List<LocalizedFlowDataLoginTerms> {
fun TermPolicies.toLocalizedLoginTerms(
userLanguage: String,
defaultLanguage: String = "en"
): List<LocalizedFlowDataLoginTerms> {
val result = ArrayList<LocalizedFlowDataLoginTerms>()
val policies = get("policies")

View file

@ -39,10 +39,12 @@ interface LoginWizard {
* @param deviceId the device id, optional. If not provided or null, the server will generate one.
* @return a [Session] if the login is successful
*/
suspend fun login(login: String,
suspend fun login(
login: String,
password: String,
initialDeviceName: String,
deviceId: String? = null): Session
deviceId: String? = null
): Session
/**
* Exchange a login token to an access token.
@ -65,8 +67,10 @@ interface LoginWizard {
* @param email an email previously associated to the account the user wants the password to be reset.
* @param newPassword the desired new password
*/
suspend fun resetPassword(email: String,
newPassword: String)
suspend fun resetPassword(
email: String,
newPassword: String
)
/**
* Confirm the new password, once the user has checked their email

View file

@ -54,9 +54,11 @@ interface RegistrationWizard {
* @param password the desired password
* @param initialDeviceDisplayName the device display name
*/
suspend fun createAccount(userName: String?,
suspend fun createAccount(
userName: String?,
password: String?,
initialDeviceDisplayName: String?): RegistrationResult
initialDeviceDisplayName: String?
): RegistrationResult
/**
* Perform the "m.login.recaptcha" stage.

View file

@ -26,9 +26,11 @@ sealed class WellknownResult {
* Retrieve the specific piece of information from the user in a way which fits within the existing client user experience,
* if the client is inclined to do so. Failure can take place instead if no good user experience for this is possible at this point.
*/
data class Prompt(val homeServerUrl: String,
data class Prompt(
val homeServerUrl: String,
val identityServerUrl: String?,
val wellKnown: WellKnown) : WellknownResult()
val wellKnown: WellKnown
) : WellknownResult()
/**
* Stop the current auto-discovery mechanism. If no more auto-discovery mechanisms are available,

View file

@ -27,8 +27,10 @@ interface AccountService {
* @param password Current password.
* @param newPassword New password
*/
suspend fun changePassword(password: String,
newPassword: String)
suspend fun changePassword(
password: String,
newPassword: String
)
/**
* Deactivate the account.
@ -46,6 +48,8 @@ interface AccountService {
* an incomplete view of conversations
* @param userInteractiveAuthInterceptor see [UserInteractiveAuthInterceptor]
*/
suspend fun deactivateAccount(eraseAllData: Boolean,
userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor)
suspend fun deactivateAccount(
eraseAllData: Boolean,
userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor
)
}

View file

@ -91,10 +91,12 @@ interface MxCall : MxCallDetail {
* Send a m.call.replaces event to initiate call transfer.
* See [org.matrix.android.sdk.api.session.room.model.call.CallReplacesContent] for documentation about the parameters
*/
suspend fun transfer(targetUserId: String,
suspend fun transfer(
targetUserId: String,
targetRoomId: String?,
createCallId: String?,
awaitCallId: String?)
awaitCallId: String?
)
fun addListener(listener: StateListener)
fun removeListener(listener: StateListener)

View file

@ -88,9 +88,11 @@ interface CryptoService {
fun getDeviceTrackingStatus(userId: String): Int
suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
suspend fun importRoomKeys(
roomKeysAsArray: ByteArray,
password: String,
progressListener: ProgressListener?): ImportRoomKeysResult
progressListener: ProgressListener?
): ImportRoomKeysResult
suspend fun exportRoomKeys(password: String): ByteArray
@ -119,10 +121,12 @@ interface CryptoService {
fun isRoomEncrypted(roomId: String): Boolean
// TODO This could be removed from this interface
fun encryptEventContent(eventContent: Content,
fun encryptEventContent(
eventContent: Content,
eventType: String,
roomId: String,
callback: MatrixCallback<MXEncryptEventContentResult>)
callback: MatrixCallback<MXEncryptEventContentResult>
)
fun discardOutboundSession(roomId: String)

View file

@ -25,12 +25,14 @@ import org.matrix.olm.OlmException
*/
sealed class MXCryptoError : Throwable() {
data class Base(val errorType: ErrorType,
data class Base(
val errorType: ErrorType,
val technicalMessage: String,
/**
* Describe the error with more details.
*/
val detailedErrorDescription: String? = null) : MXCryptoError()
val detailedErrorDescription: String? = null
) : MXCryptoError()
data class OlmError(val olmException: OlmException) : MXCryptoError()

View file

@ -37,14 +37,18 @@ interface CrossSigningService {
* Initialize cross signing for this user.
* Users needs to enter credentials
*/
fun initializeCrossSigning(uiaInterceptor: UserInteractiveAuthInterceptor?,
callback: MatrixCallback<Unit>)
fun initializeCrossSigning(
uiaInterceptor: UserInteractiveAuthInterceptor?,
callback: MatrixCallback<Unit>
)
fun isCrossSigningInitialized(): Boolean = getMyCrossSigningKeys() != null
fun checkTrustFromPrivateKeys(masterKeyPrivateKey: String?,
fun checkTrustFromPrivateKeys(
masterKeyPrivateKey: String?,
uskKeyPrivateKey: String?,
sskPrivateKey: String?): UserTrustResult
sskPrivateKey: String?
): UserTrustResult
fun getUserCrossSigningKeys(otherUserId: String): MXCrossSigningInfo?
@ -60,20 +64,26 @@ interface CrossSigningService {
fun allPrivateKeysKnown(): Boolean
fun trustUser(otherUserId: String,
callback: MatrixCallback<Unit>)
fun trustUser(
otherUserId: String,
callback: MatrixCallback<Unit>
)
fun markMyMasterKeyAsTrusted()
/**
* Sign one of your devices and upload the signature.
*/
fun trustDevice(deviceId: String,
callback: MatrixCallback<Unit>)
fun trustDevice(
deviceId: String,
callback: MatrixCallback<Unit>
)
fun checkDeviceTrust(otherUserId: String,
fun checkDeviceTrust(
otherUserId: String,
otherDeviceId: String,
locallyTrusted: Boolean?): DeviceTrustResult
locallyTrusted: Boolean?
): DeviceTrustResult
// FIXME Those method do not have to be in the service
fun onSecretMSKGossip(mskPrivateKey: String)

View file

@ -36,8 +36,10 @@ interface KeysBackupService {
* @param keysBackupCreationInfo the info object from [prepareKeysBackupVersion].
* @param callback Asynchronous callback
*/
fun createKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>)
fun createKeysBackupVersion(
keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>
)
/**
* Facility method to get the total number of locally stored keys.
@ -55,8 +57,10 @@ interface KeysBackupService {
* @param progressListener the callback to follow the progress
* @param callback the main callback
*/
fun backupAllGroupSessions(progressListener: ProgressListener?,
callback: MatrixCallback<Unit>?)
fun backupAllGroupSessions(
progressListener: ProgressListener?,
callback: MatrixCallback<Unit>?
)
/**
* Check trust on a key backup version.
@ -64,8 +68,10 @@ interface KeysBackupService {
* @param keysBackupVersion the backup version to check.
* @param callback block called when the operations completes.
*/
fun getKeysBackupTrust(keysBackupVersion: KeysVersionResult,
callback: MatrixCallback<KeysBackupVersionTrust>)
fun getKeysBackupTrust(
keysBackupVersion: KeysVersionResult,
callback: MatrixCallback<KeysBackupVersionTrust>
)
/**
* Return the current progress of the backup.
@ -79,8 +85,10 @@ interface KeysBackupService {
* @param version the backup version
* @param callback
*/
fun getVersion(version: String,
callback: MatrixCallback<KeysVersionResult?>)
fun getVersion(
version: String,
callback: MatrixCallback<KeysVersionResult?>
)
/**
* This method fetches the last backup version on the server, then compare to the currently backup version use.
@ -114,9 +122,11 @@ interface KeysBackupService {
* @param progressListener a progress listener, as generating private key from password may take a while
* @param callback Asynchronous callback
*/
fun prepareKeysBackupVersion(password: String?,
fun prepareKeysBackupVersion(
password: String?,
progressListener: ProgressListener?,
callback: MatrixCallback<MegolmBackupCreationInfo>)
callback: MatrixCallback<MegolmBackupCreationInfo>
)
/**
* Delete a keys backup version. It will delete all backed up keys on the server, and the backup itself.
@ -125,8 +135,10 @@ interface KeysBackupService {
* @param version the backup version to delete.
* @param callback Asynchronous callback
*/
fun deleteBackup(version: String,
callback: MatrixCallback<Unit>?)
fun deleteBackup(
version: String,
callback: MatrixCallback<Unit>?
)
/**
* Ask if the backup on the server contains keys that we may do not have locally.
@ -142,9 +154,11 @@ interface KeysBackupService {
* @param trust the trust to set to the keys backup.
* @param callback block called when the operations completes.
*/
fun trustKeysBackupVersion(keysBackupVersion: KeysVersionResult,
fun trustKeysBackupVersion(
keysBackupVersion: KeysVersionResult,
trust: Boolean,
callback: MatrixCallback<Unit>)
callback: MatrixCallback<Unit>
)
/**
* Set trust on a keys backup version.
@ -153,9 +167,11 @@ interface KeysBackupService {
* @param recoveryKey the recovery key to challenge with the key backup public key.
* @param callback block called when the operations completes.
*/
fun trustKeysBackupVersionWithRecoveryKey(keysBackupVersion: KeysVersionResult,
fun trustKeysBackupVersionWithRecoveryKey(
keysBackupVersion: KeysVersionResult,
recoveryKey: String,
callback: MatrixCallback<Unit>)
callback: MatrixCallback<Unit>
)
/**
* Set trust on a keys backup version.
@ -164,9 +180,11 @@ interface KeysBackupService {
* @param password the pass phrase to challenge with the keyBackupVersion public key.
* @param callback block called when the operations completes.
*/
fun trustKeysBackupVersionWithPassphrase(keysBackupVersion: KeysVersionResult,
fun trustKeysBackupVersionWithPassphrase(
keysBackupVersion: KeysVersionResult,
password: String,
callback: MatrixCallback<Unit>)
callback: MatrixCallback<Unit>
)
fun onSecretKeyGossip(secret: String)
@ -180,11 +198,13 @@ interface KeysBackupService {
* @param stepProgressListener the step progress listener
* @param callback Callback. It provides the number of found keys and the number of successfully imported keys.
*/
fun restoreKeysWithRecoveryKey(keysVersionResult: KeysVersionResult,
fun restoreKeysWithRecoveryKey(
keysVersionResult: KeysVersionResult,
recoveryKey: String, roomId: String?,
sessionId: String?,
stepProgressListener: StepProgressListener?,
callback: MatrixCallback<ImportRoomKeysResult>)
callback: MatrixCallback<ImportRoomKeysResult>
)
/**
* Restore a backup with a password from a given backup version stored on the homeserver.
@ -196,12 +216,14 @@ interface KeysBackupService {
* @param stepProgressListener the step progress listener
* @param callback Callback. It provides the number of found keys and the number of successfully imported keys.
*/
fun restoreKeyBackupWithPassword(keysBackupVersion: KeysVersionResult,
fun restoreKeyBackupWithPassword(
keysBackupVersion: KeysVersionResult,
password: String,
roomId: String?,
sessionId: String?,
stepProgressListener: StepProgressListener?,
callback: MatrixCallback<ImportRoomKeysResult>)
callback: MatrixCallback<ImportRoomKeysResult>
)
val keysBackupVersion: KeysVersionResult?
val currentBackupVersion: String?
@ -215,8 +237,10 @@ interface KeysBackupService {
fun isValidRecoveryKeyForCurrentVersion(recoveryKey: String, callback: MatrixCallback<Boolean>)
fun computePrivateKey(passphrase: String,
fun computePrivateKey(
passphrase: String,
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray
progressListener: ProgressListener
): ByteArray
}

View file

@ -40,7 +40,8 @@ sealed class KeysBackupVersionTrustSignature {
/**
* Flag to indicate the signature from this device is valid.
*/
val valid: Boolean) : KeysBackupVersionTrustSignature()
val valid: Boolean
) : KeysBackupVersionTrustSignature()
data class UserSignature(
val keyId: String?,

View file

@ -19,7 +19,8 @@ package org.matrix.android.sdk.api.session.crypto.verification
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
data class EmojiRepresentation(val emoji: String,
data class EmojiRepresentation(
val emoji: String,
@StringRes val nameResId: Int,
@DrawableRes val drawableRes: Int? = null
)

View file

@ -46,54 +46,68 @@ interface VerificationService {
fun getExistingVerificationRequestInRoom(roomId: String, tid: String?): PendingVerificationRequest?
fun beginKeyVerification(method: VerificationMethod,
fun beginKeyVerification(
method: VerificationMethod,
otherUserId: String,
otherDeviceId: String,
transactionId: String?): String?
transactionId: String?
): String?
/**
* Request key verification with another user via room events (instead of the to-device API).
*/
fun requestKeyVerificationInDMs(methods: List<VerificationMethod>,
fun requestKeyVerificationInDMs(
methods: List<VerificationMethod>,
otherUserId: String,
roomId: String,
localId: String? = LocalEcho.createLocalEchoId()): PendingVerificationRequest
localId: String? = LocalEcho.createLocalEchoId()
): PendingVerificationRequest
fun cancelVerificationRequest(request: PendingVerificationRequest)
/**
* Request a key verification from another user using toDevice events.
*/
fun requestKeyVerification(methods: List<VerificationMethod>,
fun requestKeyVerification(
methods: List<VerificationMethod>,
otherUserId: String,
otherDevices: List<String>?): PendingVerificationRequest
otherDevices: List<String>?
): PendingVerificationRequest
fun declineVerificationRequestInDMs(otherUserId: String,
fun declineVerificationRequestInDMs(
otherUserId: String,
transactionId: String,
roomId: String)
roomId: String
)
// Only SAS method is supported for the moment
// TODO Parameter otherDeviceId should be removed in this case
fun beginKeyVerificationInDMs(method: VerificationMethod,
fun beginKeyVerificationInDMs(
method: VerificationMethod,
transactionId: String,
roomId: String,
otherUserId: String,
otherDeviceId: String): String
otherDeviceId: String
): String
/**
* Returns false if the request is unknown.
*/
fun readyPendingVerificationInDMs(methods: List<VerificationMethod>,
fun readyPendingVerificationInDMs(
methods: List<VerificationMethod>,
otherUserId: String,
roomId: String,
transactionId: String): Boolean
transactionId: String
): Boolean
/**
* Returns false if the request is unknown.
*/
fun readyPendingVerification(methods: List<VerificationMethod>,
fun readyPendingVerification(
methods: List<VerificationMethod>,
otherUserId: String,
transactionId: String): Boolean
transactionId: String
): Boolean
interface Listener {
/**

View file

@ -24,6 +24,8 @@ interface EventService {
* Ask the homeserver for an event content. The SDK will try to decrypt it if it is possible
* The result will not be stored into cache
*/
suspend fun getEvent(roomId: String,
eventId: String): Event
suspend fun getEvent(
roomId: String,
eventId: String
): Event
}

View file

@ -44,10 +44,12 @@ interface FileService {
* Download a file if necessary and ensure that if the file is encrypted, the file is decrypted.
* Result will be a decrypted file, stored in the cache folder. url parameter will be used to create unique filename to avoid name collision.
*/
suspend fun downloadFile(fileName: String,
suspend fun downloadFile(
fileName: String,
mimeType: String?,
url: String?,
elementToDecrypt: ElementToDecrypt?): File
elementToDecrypt: ElementToDecrypt?
): File
suspend fun downloadFile(messageContent: MessageWithAttachmentContent): File =
downloadFile(
@ -57,7 +59,8 @@ interface FileService {
elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt()
)
fun isFileInCache(mxcUrl: String?,
fun isFileInCache(
mxcUrl: String?,
fileName: String,
mimeType: String?,
elementToDecrypt: ElementToDecrypt?
@ -75,10 +78,12 @@ interface FileService {
* Use this URI and pass it to intent using flag Intent.FLAG_GRANT_READ_URI_PERMISSION
* (if not other app won't be able to access it).
*/
fun getTemporarySharableURI(mxcUrl: String?,
fun getTemporarySharableURI(
mxcUrl: String?,
fileName: String,
mimeType: String?,
elementToDecrypt: ElementToDecrypt?): Uri?
elementToDecrypt: ElementToDecrypt?
): Uri?
fun getTemporarySharableURI(messageContent: MessageWithAttachmentContent): Uri? =
getTemporarySharableURI(
@ -92,10 +97,12 @@ interface FileService {
* Get information on the given file.
* Mimetype should be the same one as passed to downloadFile (limitation for now)
*/
fun fileState(mxcUrl: String?,
fun fileState(
mxcUrl: String?,
fileName: String,
mimeType: String?,
elementToDecrypt: ElementToDecrypt?): FileState
elementToDecrypt: ElementToDecrypt?
): FileState
fun fileState(messageContent: MessageWithAttachmentContent): FileState =
fileState(

View file

@ -25,8 +25,10 @@ import org.matrix.android.sdk.api.session.permalinks.MatrixPermalinkSpan.Callbac
* @property url the permalink url tied to the span
* @property callback the callback to use.
*/
class MatrixPermalinkSpan(private val url: String,
private val callback: Callback? = null) : ClickableSpan() {
class MatrixPermalinkSpan(
private val url: String,
private val callback: Callback? = null
) : ClickableSpan() {
interface Callback {
fun onUrlClicked(url: String)

View file

@ -107,8 +107,10 @@ interface ProfileService {
/**
* Finalize adding a 3Pids. Call this method once the user has validated that he owns the ThreePid.
*/
suspend fun finalizeAddingThreePid(threePid: ThreePid,
userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor)
suspend fun finalizeAddingThreePid(
threePid: ThreePid,
userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor
)
/**
* Cancel adding a threepid. It will remove locally stored data about this ThreePid.

View file

@ -58,12 +58,14 @@ interface PushersService {
* email pushers since we don't want to stop other accounts notifying to the same email address.
* @throws [InvalidParameterException] if a parameter is not correct
*/
suspend fun addEmailPusher(email: String,
suspend fun addEmailPusher(
email: String,
lang: String,
emailBranding: String,
appDisplayName: String,
deviceDisplayName: String,
append: Boolean = true)
append: Boolean = true
)
/**
* Directly ask the push gateway to send a push to this device.
@ -75,10 +77,12 @@ interface PushersService {
* @param pushkey the FCM token
* @param eventId the eventId which will be sent in the Push message. Use a fake eventId.
*/
suspend fun testPush(url: String,
suspend fun testPush(
url: String,
appId: String,
pushkey: String,
eventId: String)
eventId: String
)
/**
* Remove a registered pusher.

View file

@ -22,15 +22,23 @@ import org.matrix.android.sdk.api.session.events.model.Event
* This class as all required context needed to evaluate rules
*/
interface ConditionResolver {
fun resolveEventMatchCondition(event: Event,
condition: EventMatchCondition): Boolean
fun resolveEventMatchCondition(
event: Event,
condition: EventMatchCondition
): Boolean
fun resolveRoomMemberCountCondition(event: Event,
condition: RoomMemberCountCondition): Boolean
fun resolveRoomMemberCountCondition(
event: Event,
condition: RoomMemberCountCondition
): Boolean
fun resolveSenderNotificationPermissionCondition(event: Event,
condition: SenderNotificationPermissionCondition): Boolean
fun resolveSenderNotificationPermissionCondition(
event: Event,
condition: SenderNotificationPermissionCondition
): Boolean
fun resolveContainsDisplayNameCondition(event: Event,
condition: ContainsDisplayNameCondition): Boolean
fun resolveContainsDisplayNameCondition(
event: Event,
condition: ContainsDisplayNameCondition
): Boolean
}

View file

@ -51,8 +51,10 @@ interface PushRuleService {
// fun fulfilledBingRule(event: Event, rules: List<PushRule>): PushRule?
fun resolveSenderNotificationPermissionCondition(event: Event,
condition: SenderNotificationPermissionCondition): Boolean
fun resolveSenderNotificationPermissionCondition(
event: Event,
condition: SenderNotificationPermissionCondition
): Boolean
interface PushRuleListener {
fun onEvents(pushEvents: PushEvents)

View file

@ -28,8 +28,10 @@ interface RoomDirectoryService {
/**
* Get rooms from directory.
*/
suspend fun getPublicRooms(server: String?,
publicRoomsParams: PublicRoomsParams): PublicRoomsResponse
suspend fun getPublicRooms(
server: String?,
publicRoomsParams: PublicRoomsParams
): PublicRoomsResponse
/**
* Get the visibility of a room in the directory.

View file

@ -60,9 +60,11 @@ interface RoomService {
* @param reason optional reason for joining the room
* @param viaServers the servers to attempt to join the room through. One of the servers must be participating in the room.
*/
suspend fun joinRoom(roomIdOrAlias: String,
suspend fun joinRoom(
roomIdOrAlias: String,
reason: String? = null,
viaServers: List<String> = emptyList())
viaServers: List<String> = emptyList()
)
/**
* @param roomId the roomId of the room to join
@ -101,15 +103,19 @@ interface RoomService {
* Get a snapshot list of room summaries.
* @return the immutable list of [RoomSummary]
*/
fun getRoomSummaries(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary>
fun getRoomSummaries(
queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE
): List<RoomSummary>
/**
* Get a live list of room summaries. This list is refreshed as soon as the data changes.
* @return the [LiveData] of List[RoomSummary]
*/
fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): LiveData<List<RoomSummary>>
fun getRoomSummariesLive(
queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY
): LiveData<List<RoomSummary>>
/**
* Get a snapshot list of Breadcrumbs.
@ -139,8 +145,10 @@ interface RoomService {
/**
* Resolve a room alias to a room ID.
*/
suspend fun getRoomIdByAlias(roomAlias: String,
searchOnServer: Boolean): Optional<RoomAliasDescription>
suspend fun getRoomIdByAlias(
roomAlias: String,
searchOnServer: Boolean
): Optional<RoomAliasDescription>
/**
* Delete a room alias.
@ -205,16 +213,20 @@ interface RoomService {
/**
* TODO Doc.
*/
fun getPagedRoomSummariesLive(queryParams: RoomSummaryQueryParams,
fun getPagedRoomSummariesLive(
queryParams: RoomSummaryQueryParams,
pagedListConfig: PagedList.Config = defaultPagedListConfig,
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): LiveData<PagedList<RoomSummary>>
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY
): LiveData<PagedList<RoomSummary>>
/**
* TODO Doc.
*/
fun getFilteredPagedRoomSummariesLive(queryParams: RoomSummaryQueryParams,
fun getFilteredPagedRoomSummariesLive(
queryParams: RoomSummaryQueryParams,
pagedListConfig: PagedList.Config = defaultPagedListConfig,
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): UpdatableLivePageResult
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY
): UpdatableLivePageResult
/**
* Return a LiveData on the number of rooms.
@ -240,8 +252,10 @@ interface RoomService {
/**
* Returns all the children of this space, as LiveData.
*/
fun getFlattenRoomSummaryChildrenOfLive(spaceId: String?,
memberships: List<Membership> = Membership.activeMemberships()): LiveData<List<RoomSummary>>
fun getFlattenRoomSummaryChildrenOfLive(
spaceId: String?,
memberships: List<Membership> = Membership.activeMemberships()
): LiveData<List<RoomSummary>>
/**
* Refreshes the RoomSummary LatestPreviewContent for the given @param roomId.

View file

@ -40,12 +40,14 @@ internal data class MessageVerificationAcceptContent(
companion object : VerificationInfoAcceptFactory {
override fun create(tid: String,
override fun create(
tid: String,
keyAgreementProtocol: String,
hash: String,
commitment: String,
messageAuthenticationCode: String,
shortAuthenticationStrings: List<String>): VerificationInfoAccept {
shortAuthenticationStrings: List<String>
): VerificationInfoAccept {
return MessageVerificationAcceptContent(
hash,
keyAgreementProtocol,

View file

@ -58,16 +58,20 @@ interface RelationService {
* @param targetEventId the id of the event being reacted
* @param reaction the reaction (preferably emoji)
*/
fun sendReaction(targetEventId: String,
reaction: String): Cancelable
fun sendReaction(
targetEventId: String,
reaction: String
): Cancelable
/**
* Undo a reaction (emoji) to the targetedEvent.
* @param targetEventId the id of the event being reacted
* @param reaction the reaction (preferably emoji)
*/
suspend fun undoReaction(targetEventId: String,
reaction: String): Cancelable
suspend fun undoReaction(
targetEventId: String,
reaction: String
): Cancelable
/**
* Edit a poll.
@ -76,10 +80,12 @@ interface RelationService {
* @param question The edited question
* @param options The edited options
*/
fun editPoll(targetEvent: TimelineEvent,
fun editPoll(
targetEvent: TimelineEvent,
pollType: PollType,
question: String,
options: List<String>): Cancelable
options: List<String>
): Cancelable
/**
* Edit a text message body. Limited to "m.text" contentType.
@ -89,11 +95,13 @@ interface RelationService {
* @param newBodyAutoMarkdown true to parse markdown on the new body
* @param compatibilityBodyText The text that will appear on clients that don't support yet edition
*/
fun editTextMessage(targetEvent: TimelineEvent,
fun editTextMessage(
targetEvent: TimelineEvent,
msgType: String,
newBodyText: CharSequence,
newBodyAutoMarkdown: Boolean,
compatibilityBodyText: String = "* $newBodyText"): Cancelable
compatibilityBodyText: String = "* $newBodyText"
): Cancelable
/**
* Edit a reply. This is a special case because replies contains fallback text as a prefix.
@ -103,10 +111,12 @@ interface RelationService {
* @param newBodyText The edited body (stripped from in reply to content)
* @param compatibilityBodyText The text that will appear on clients that don't support yet edition
*/
fun editReply(replyToEdit: TimelineEvent,
fun editReply(
replyToEdit: TimelineEvent,
originalTimelineEvent: TimelineEvent,
newBodyText: String,
compatibilityBodyText: String = "* $newBodyText"): Cancelable
compatibilityBodyText: String = "* $newBodyText"
): Cancelable
/**
* Get the edit history of the given event.
@ -127,7 +137,8 @@ interface RelationService {
* @param showInThread If true, relation will be added to the reply in order to be visible from within threads
* @param rootThreadEventId If show in thread is true then we need the rootThreadEventId to generate the relation
*/
fun replyToMessage(eventReplied: TimelineEvent,
fun replyToMessage(
eventReplied: TimelineEvent,
replyText: CharSequence,
autoMarkdown: Boolean = false,
showInThread: Boolean = false,
@ -159,10 +170,12 @@ interface RelationService {
* @param formattedText The formatted body using MessageType#FORMAT_MATRIX_HTML
* @param eventReplied the event referenced by the reply within a thread
*/
fun replyInThread(rootThreadEventId: String,
fun replyInThread(
rootThreadEventId: String,
replyInThreadText: CharSequence,
msgType: String = MessageType.MSGTYPE_TEXT,
autoMarkdown: Boolean = false,
formattedText: String? = null,
eventReplied: TimelineEvent? = null): Cancelable?
eventReplied: TimelineEvent? = null
): Cancelable?
}

View file

@ -76,10 +76,12 @@ interface SendService {
* @param rootThreadEventId when this param is not null, the Media will be sent in this specific thread
* @return a [Cancelable]
*/
fun sendMedia(attachment: ContentAttachmentData,
fun sendMedia(
attachment: ContentAttachmentData,
compressBeforeSending: Boolean,
roomIds: Set<String>,
rootThreadEventId: String? = null): Cancelable
rootThreadEventId: String? = null
): Cancelable
/**
* Method to send a list of media asynchronously.
@ -90,10 +92,12 @@ interface SendService {
* @param rootThreadEventId when this param is not null, all the Media will be sent in this specific thread
* @return a [Cancelable]
*/
fun sendMedias(attachments: List<ContentAttachmentData>,
fun sendMedias(
attachments: List<ContentAttachmentData>,
compressBeforeSending: Boolean,
roomIds: Set<String>,
rootThreadEventId: String? = null): Cancelable
rootThreadEventId: String? = null
): Cancelable
/**
* Send a poll to the room.

View file

@ -16,5 +16,7 @@
package org.matrix.android.sdk.api.session.room.threads.model
data class ThreadEditions(var rootThreadEdition: String? = null,
var latestThreadEdition: String? = null)
data class ThreadEditions(
var rootThreadEdition: String? = null,
var latestThreadEdition: String? = null
)

View file

@ -22,7 +22,8 @@ import org.matrix.android.sdk.api.session.room.sender.SenderInfo
/**
* The main thread Summary model, mainly used to display the thread list.
*/
data class ThreadSummary(val roomId: String,
data class ThreadSummary(
val roomId: String,
val rootEvent: Event?,
val latestEvent: Event?,
val rootEventId: String,
@ -30,4 +31,5 @@ data class ThreadSummary(val roomId: String,
val latestThreadSenderInfo: SenderInfo,
val isUserParticipating: Boolean,
val numberOfThreads: Int,
val threadEditions: ThreadEditions = ThreadEditions())
val threadEditions: ThreadEditions = ThreadEditions()
)

View file

@ -33,12 +33,14 @@ interface SearchService {
* @param afterLimit how many events after the result are returned.
* @param includeProfile requests that the server returns the historic profile information for the users that sent the events that were returned.
*/
suspend fun search(searchTerm: String,
suspend fun search(
searchTerm: String,
roomId: String,
nextBatch: String?,
orderByRecent: Boolean,
limit: Int,
beforeLimit: Int,
afterLimit: Int,
includeProfile: Boolean): SearchResult
includeProfile: Boolean
): SearchResult
}

View file

@ -44,10 +44,12 @@ interface SharedSecretStorageService {
*
* @return key creation info
*/
suspend fun generateKey(keyId: String,
suspend fun generateKey(
keyId: String,
key: SsssKeySpec?,
keyName: String,
keySigner: KeySigner?): SsssKeyCreationInfo
keySigner: KeySigner?
): SsssKeyCreationInfo
/**
* Generates a SSSS key using the given passphrase.
@ -61,11 +63,13 @@ interface SharedSecretStorageService {
*
* @return key creation info
*/
suspend fun generateKeyWithPassphrase(keyId: String,
suspend fun generateKeyWithPassphrase(
keyId: String,
keyName: String,
passphrase: String,
keySigner: KeySigner,
progressListener: ProgressListener?): SsssKeyCreationInfo
progressListener: ProgressListener?
): SsssKeyCreationInfo
fun getKey(keyId: String): KeyInfoResult

View file

@ -31,11 +31,13 @@ interface Space {
*/
fun spaceSummary(): RoomSummary?
suspend fun addChildren(roomId: String,
suspend fun addChildren(
roomId: String,
viaServers: List<String>?,
order: String?,
// autoJoin: Boolean = false,
suggested: Boolean? = false)
suggested: Boolean? = false
)
fun getChildInfo(roomId: String): SpaceChildContent?

View file

@ -37,11 +37,13 @@ interface SpaceService {
/**
* Just a shortcut for space creation for ease of use.
*/
suspend fun createSpace(name: String,
suspend fun createSpace(
name: String,
topic: String?,
avatarUri: Uri?,
isPublic: Boolean,
roomAliasLocalPart: String? = null): String
roomAliasLocalPart: String? = null
): String
/**
* Get a space from a spaceId.
@ -68,25 +70,33 @@ interface SpaceService {
* then the parameters given for suggested_only and max_depth must be the same.
* @param knownStateList when paginating, pass back the m.space.child state events
*/
suspend fun querySpaceChildren(spaceId: String,
suspend fun querySpaceChildren(
spaceId: String,
suggestedOnly: Boolean? = null,
limit: Int? = null,
from: String? = null,
knownStateList: List<Event>? = null): SpaceHierarchyData
knownStateList: List<Event>? = null
): SpaceHierarchyData
/**
* Get a live list of space summaries. This list is refreshed as soon as the data changes.
* @return the [LiveData] of List[SpaceSummary]
*/
fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): LiveData<List<RoomSummary>>
fun getSpaceSummariesLive(
queryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE
): LiveData<List<RoomSummary>>
fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary>
fun getSpaceSummaries(
spaceSummaryQueryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE
): List<RoomSummary>
suspend fun joinSpace(spaceIdOrAlias: String,
suspend fun joinSpace(
spaceIdOrAlias: String,
reason: String? = null,
viaServers: List<String> = emptyList()): JoinSpaceResult
viaServers: List<String> = emptyList()
): JoinSpaceResult
suspend fun rejectInvite(spaceId: String, reason: String?)

View file

@ -23,15 +23,19 @@ sealed interface StatisticEvent {
/**
* Initial sync request, response downloading, and treatment (parsing and storage) of response.
*/
data class InitialSyncRequest(val requestDurationMs: Int,
data class InitialSyncRequest(
val requestDurationMs: Int,
val downloadDurationMs: Int,
val treatmentDurationMs: Int,
val nbOfJoinedRooms: Int) : StatisticEvent
val nbOfJoinedRooms: Int
) : StatisticEvent
/**
* Incremental sync event.
*/
data class SyncTreatment(val durationMs: Int,
data class SyncTreatment(
val durationMs: Int,
val afterPause: Boolean,
val nbOfJoinedRooms: Int) : StatisticEvent
val nbOfJoinedRooms: Int
) : StatisticEvent
}

View file

@ -38,4 +38,5 @@ data class RoomSyncUnreadNotifications(
/**
* The number of highlighted unread messages (subset of notifications).
*/
@Json(name = "highlight_count") val highlightCount: Int? = null)
@Json(name = "highlight_count") val highlightCount: Int? = null
)

View file

@ -30,8 +30,10 @@ data class TermsResponse(
val policies: JsonDict? = null
) {
fun getLocalizedTerms(userLanguage: String,
defaultLanguage: String = "en"): List<LocalizedFlowDataLoginTerms> {
fun getLocalizedTerms(
userLanguage: String,
defaultLanguage: String = "en"
): List<LocalizedFlowDataLoginTerms> {
return policies?.map {
val tos = policies[it.key] as? Map<*, *> ?: return@map null
((tos[userLanguage] ?: tos[defaultLanguage]) as? Map<*, *>)?.let { termsMap ->

View file

@ -24,10 +24,12 @@ interface TermsService {
suspend fun getTerms(serviceType: ServiceType, baseUrl: String): GetTermsResponse
suspend fun agreeToTerms(serviceType: ServiceType,
suspend fun agreeToTerms(
serviceType: ServiceType,
baseUrl: String,
agreedUrls: List<String>,
token: String?)
token: String?
)
/**
* Get the homeserver terms, from the register API.

View file

@ -33,9 +33,11 @@ sealed class MatrixItem(
open val displayName: String?,
open val avatarUrl: String?
) {
data class UserItem(override val id: String,
data class UserItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName?.removeSuffix(IRC_PATTERN), avatarUrl) {
init {
@ -45,10 +47,12 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class EveryoneInRoomItem(override val id: String,
data class EveryoneInRoomItem(
override val id: String,
override val displayName: String = NOTIFY_EVERYONE,
override val avatarUrl: String? = null,
val roomDisplayName: String? = null) :
val roomDisplayName: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()
@ -57,9 +61,11 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class EventItem(override val id: String,
data class EventItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()
@ -68,9 +74,11 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class RoomItem(override val id: String,
data class RoomItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()
@ -79,9 +87,11 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class SpaceItem(override val id: String,
data class SpaceItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()
@ -90,9 +100,11 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class RoomAliasItem(override val id: String,
data class RoomAliasItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()
@ -101,9 +113,11 @@ sealed class MatrixItem(
override fun updateAvatar(newAvatar: String?) = copy(avatarUrl = newAvatar)
}
data class GroupItem(override val id: String,
data class GroupItem(
override val id: String,
override val displayName: String? = null,
override val avatarUrl: String? = null) :
override val avatarUrl: String? = null
) :
MatrixItem(id, displayName, avatarUrl) {
init {
if (BuildConfig.DEBUG) checkId()

View file

@ -27,8 +27,10 @@ import org.matrix.android.sdk.internal.session.SessionComponent
import javax.inject.Inject
@MatrixScope
internal class SessionManager @Inject constructor(private val matrixComponent: MatrixComponent,
private val sessionParamsStore: SessionParamsStore) {
internal class SessionManager @Inject constructor(
private val matrixComponent: MatrixComponent,
private val sessionParamsStore: SessionParamsStore
) {
// SessionId -> SessionComponent
private val sessionComponents = HashMap<String, SessionComponent>()

View file

@ -98,15 +98,19 @@ internal interface AuthAPI {
* https://github.com/matrix-org/matrix-doc/pull/2290
*/
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register/{threePid}/requestToken")
suspend fun add3Pid(@Path("threePid") threePid: String,
@Body params: AddThreePidRegistrationParams): AddThreePidRegistrationResponse
suspend fun add3Pid(
@Path("threePid") threePid: String,
@Body params: AddThreePidRegistrationParams
): AddThreePidRegistrationResponse
/**
* Validate 3pid.
*/
@POST
suspend fun validate3Pid(@Url url: String,
@Body params: ValidationCodeBody): SuccessResult
suspend fun validate3Pid(
@Url url: String,
@Body params: ValidationCodeBody
): SuccessResult
/**
* Get the supported login flow.

View file

@ -46,9 +46,11 @@ internal abstract class AuthModule {
@JvmStatic
@Provides
@AuthDatabase
fun providesRealmConfiguration(context: Context,
fun providesRealmConfiguration(
context: Context,
realmKeysUtils: RealmKeysUtils,
authRealmMigration: AuthRealmMigration): RealmConfiguration {
authRealmMigration: AuthRealmMigration
): RealmConfiguration {
val old = File(context.filesDir, "matrix-sdk-auth")
if (old.exists()) {
old.renameTo(File(context.filesDir, "matrix-sdk-auth.realm"))

View file

@ -368,13 +368,17 @@ internal class DefaultAuthenticationService @Inject constructor(
pendingSessionStore.delete()
}
override suspend fun createSessionFromSso(homeServerConnectionConfig: HomeServerConnectionConfig,
credentials: Credentials): Session {
override suspend fun createSessionFromSso(
homeServerConnectionConfig: HomeServerConnectionConfig,
credentials: Credentials
): Session {
return sessionCreator.createSession(credentials, homeServerConnectionConfig)
}
override suspend fun getWellKnownData(matrixId: String,
homeServerConnectionConfig: HomeServerConnectionConfig?): WellknownResult {
override suspend fun getWellKnownData(
matrixId: String,
homeServerConnectionConfig: HomeServerConnectionConfig?
): WellknownResult {
if (!MatrixPatterns.isUserId(matrixId)) {
throw MatrixIdFailure.InvalidMatrixId
}
@ -392,11 +396,13 @@ internal class DefaultAuthenticationService @Inject constructor(
.withHomeServerUri("https://dummy.org")
.build()
override suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
override suspend fun directAuthentication(
homeServerConnectionConfig: HomeServerConnectionConfig,
matrixId: String,
password: String,
initialDeviceName: String,
deviceId: String?): Session {
deviceId: String?
): Session {
return directLoginTask.execute(
DirectLoginTask.Params(
homeServerConnectionConfig = homeServerConnectionConfig,

View file

@ -31,7 +31,8 @@ internal data class PasswordLoginParams(
@Json(name = "password") val password: String,
@Json(name = "type") override val type: String,
@Json(name = "initial_device_display_name") val deviceDisplayName: String?,
@Json(name = "device_id") val deviceId: String?) : LoginParams {
@Json(name = "device_id") val deviceId: String?
) : LoginParams {
companion object {
private const val IDENTIFIER_KEY_TYPE = "type"
@ -47,10 +48,12 @@ internal data class PasswordLoginParams(
private const val IDENTIFIER_KEY_COUNTRY = "country"
private const val IDENTIFIER_KEY_PHONE = "phone"
fun userIdentifier(user: String,
fun userIdentifier(
user: String,
password: String,
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
deviceId: String?
): PasswordLoginParams {
return PasswordLoginParams(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_USER,
@ -63,11 +66,13 @@ internal data class PasswordLoginParams(
)
}
fun thirdPartyIdentifier(medium: String,
fun thirdPartyIdentifier(
medium: String,
address: String,
password: String,
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
deviceId: String?
): PasswordLoginParams {
return PasswordLoginParams(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_THIRD_PARTY,
@ -81,11 +86,13 @@ internal data class PasswordLoginParams(
)
}
fun phoneIdentifier(country: String,
fun phoneIdentifier(
country: String,
phone: String,
password: String,
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
deviceId: String?
): PasswordLoginParams {
return PasswordLoginParams(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_PHONE,

View file

@ -23,7 +23,8 @@ import org.matrix.android.sdk.internal.database.awaitTransaction
import org.matrix.android.sdk.internal.di.AuthDatabase
import javax.inject.Inject
internal class RealmPendingSessionStore @Inject constructor(private val mapper: PendingSessionMapper,
internal class RealmPendingSessionStore @Inject constructor(
private val mapper: PendingSessionMapper,
@AuthDatabase
private val realmConfiguration: RealmConfiguration
) : PendingSessionStore {

View file

@ -28,7 +28,8 @@ import org.matrix.android.sdk.internal.di.AuthDatabase
import timber.log.Timber
import javax.inject.Inject
internal class RealmSessionParamsStore @Inject constructor(private val mapper: SessionParamsMapper,
internal class RealmSessionParamsStore @Inject constructor(
private val mapper: SessionParamsMapper,
@AuthDatabase
private val realmConfiguration: RealmConfiguration
) : SessionParamsStore {

View file

@ -52,10 +52,12 @@ internal class DefaultLoginWizard(
return getProfileTask.execute(GetProfileTask.Params(matrixId))
}
override suspend fun login(login: String,
override suspend fun login(
login: String,
password: String,
initialDeviceName: String,
deviceId: String?): Session {
deviceId: String?
): Session {
val loginParams = if (Patterns.EMAIL_ADDRESS.matcher(login).matches()) {
PasswordLoginParams.thirdPartyIdentifier(
medium = ThreePidMedium.EMAIL,

View file

@ -69,9 +69,11 @@ internal class DefaultRegistrationWizard(
return performRegistrationRequest(params)
}
override suspend fun createAccount(userName: String?,
override suspend fun createAccount(
userName: String?,
password: String?,
initialDeviceDisplayName: String?): RegistrationResult {
initialDeviceDisplayName: String?
): RegistrationResult {
val params = RegistrationParams(
username = userName,
password = password,

View file

@ -40,9 +40,11 @@ internal data class ThreePidData(
}
companion object {
fun from(threePid: RegisterThreePid,
fun from(
threePid: RegisterThreePid,
addThreePidRegistrationResponse: AddThreePidRegistrationResponse,
registrationParams: RegistrationParams): ThreePidData {
registrationParams: RegistrationParams
): ThreePidData {
return when (threePid) {
is RegisterThreePid.Email ->
ThreePidData(threePid.email, "", "", addThreePidRegistrationResponse, registrationParams)

View file

@ -35,9 +35,11 @@ import kotlin.coroutines.suspendCoroutine
* @return UiaResult if UIA handled, failed or cancelled
*
*/
internal suspend fun handleUIA(failure: Throwable,
internal suspend fun handleUIA(
failure: Throwable,
interceptor: UserInteractiveAuthInterceptor,
retryBlock: suspend (UIABaseAuth) -> Unit): UiaResult {
retryBlock: suspend (UIABaseAuth) -> Unit
): UiaResult {
Timber.d("## UIA: check error ${failure.message}")
val flowResponse = failure.toRegistrationFlowResponse()
?: return UiaResult.FAILURE.also {

View file

@ -110,10 +110,12 @@ internal abstract class CryptoModule {
@Provides
@CryptoDatabase
@SessionScope
fun providesRealmConfiguration(@SessionFilesDirectory directory: File,
fun providesRealmConfiguration(
@SessionFilesDirectory directory: File,
@UserMd5 userMd5: String,
realmKeysUtils: RealmKeysUtils,
realmCryptoStoreMigration: RealmCryptoStoreMigration): RealmConfiguration {
realmCryptoStoreMigration: RealmCryptoStoreMigration
): RealmConfiguration {
return RealmConfiguration.Builder()
.directory(directory)
.apply {

View file

@ -592,10 +592,12 @@ internal class DefaultCryptoService @Inject constructor(
* @param membersId list of members to start tracking their devices
* @return true if the operation succeeds.
*/
private suspend fun setEncryptionInRoom(roomId: String,
private suspend fun setEncryptionInRoom(
roomId: String,
algorithm: String?,
inhibitDeviceQuery: Boolean,
membersId: List<String>): Boolean {
membersId: List<String>
): Boolean {
// If we already have encryption in this room, we should ignore this event
// (for now at least. Maybe we should alert the user somehow?)
val existingAlgorithm = cryptoStore.getRoomAlgorithm(roomId)
@ -691,10 +693,12 @@ internal class DefaultCryptoService @Inject constructor(
* @param roomId the room identifier the event will be sent.
* @param callback the asynchronous callback
*/
override fun encryptEventContent(eventContent: Content,
override fun encryptEventContent(
eventContent: Content,
eventType: String,
roomId: String,
callback: MatrixCallback<MXEncryptEventContentResult>) {
callback: MatrixCallback<MXEncryptEventContentResult>
) {
// moved to crypto scope to have uptodate values
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
val userIds = getRoomUserIds(roomId)
@ -879,8 +883,10 @@ internal class DefaultCryptoService @Inject constructor(
/**
* Returns true if handled by SDK, otherwise should be sent to application layer.
*/
private fun handleSDKLevelGossip(secretName: String?,
secretValue: String): Boolean {
private fun handleSDKLevelGossip(
secretName: String?,
secretValue: String
): Boolean {
return when (secretName) {
MASTER_KEY_SSSS_NAME -> {
crossSigningService.onSecretMSKGossip(secretValue)
@ -1022,9 +1028,11 @@ internal class DefaultCryptoService @Inject constructor(
* @param progressListener the progress listener
* @return the result ImportRoomKeysResult
*/
override suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
override suspend fun importRoomKeys(
roomKeysAsArray: ByteArray,
password: String,
progressListener: ProgressListener?): ImportRoomKeysResult {
progressListener: ProgressListener?
): ImportRoomKeysResult {
return withContext(coroutineDispatchers.crypto) {
Timber.tag(loggerTag.value).v("importRoomKeys starts")

View file

@ -44,7 +44,8 @@ private val loggerTag = LoggerTag("InboundGroupSessionStore", LoggerTag.CRYPTO)
internal class InboundGroupSessionStore @Inject constructor(
private val store: IMXCryptoStore,
private val cryptoCoroutineScope: CoroutineScope,
private val coroutineDispatchers: MatrixCoroutineDispatchers) {
private val coroutineDispatchers: MatrixCoroutineDispatchers
) {
private data class CacheKey(
val sessionId: String,

View file

@ -369,9 +369,11 @@ internal class IncomingKeyRequestManager @Inject constructor(
shareMegolmKey(validReq, requestingDevice, null)
}
private suspend fun shareMegolmKey(validRequest: ValidMegolmRequestBody,
private suspend fun shareMegolmKey(
validRequest: ValidMegolmRequestBody,
requestingDevice: CryptoDeviceInfo,
chainIndex: Long?): Boolean {
chainIndex: Long?
): Boolean {
Timber.tag(loggerTag.value)
.d("try to re-share Megolm Key at index $chainIndex for ${validRequest.shortDbgString()}")

View file

@ -599,13 +599,15 @@ internal class MXOlmDevice @Inject constructor(
* @param exportFormat true if the megolm keys are in export format
* @return true if the operation succeeds.
*/
fun addInboundGroupSession(sessionId: String,
fun addInboundGroupSession(
sessionId: String,
sessionKey: String,
roomId: String,
senderKey: String,
forwardingCurve25519KeyChain: List<String>,
keysClaimed: Map<String, String>,
exportFormat: Boolean): AddSessionResult {
exportFormat: Boolean
): AddSessionResult {
val candidateSession = OlmInboundGroupSessionWrapper2(sessionKey, exportFormat)
val existingSessionHolder = tryOrNull { getInboundGroupSession(sessionId, senderKey, roomId) }
val existingSession = existingSessionHolder?.wrapper
@ -760,11 +762,13 @@ internal class MXOlmDevice @Inject constructor(
* @return the decrypting result. Nil if the sessionId is unknown.
*/
@Throws(MXCryptoError::class)
suspend fun decryptGroupMessage(body: String,
suspend fun decryptGroupMessage(
body: String,
roomId: String,
timeline: String?,
sessionId: String,
senderKey: String): OlmDecryptionResult {
senderKey: String
): OlmDecryptionResult {
val sessionHolder = getInboundGroupSession(sessionId, senderKey, roomId)
val wrapper = sessionHolder.wrapper
val inboundGroupSession = wrapper.olmInboundGroupSession

View file

@ -19,8 +19,10 @@ package org.matrix.android.sdk.internal.crypto
import org.matrix.android.sdk.api.auth.data.Credentials
import javax.inject.Inject
internal class ObjectSigner @Inject constructor(private val credentials: Credentials,
private val olmDevice: MXOlmDevice) {
internal class ObjectSigner @Inject constructor(
private val credentials: Credentials,
private val olmDevice: MXOlmDevice
) {
/**
* Sign Object.

View file

@ -71,7 +71,8 @@ internal class OutgoingKeyRequestManager @Inject constructor(
private val inboundGroupSessionStore: InboundGroupSessionStore,
private val sendToDeviceTask: SendToDeviceTask,
private val deviceListManager: DeviceListManager,
private val perSessionBackupQueryRateLimiter: PerSessionBackupQueryRateLimiter) {
private val perSessionBackupQueryRateLimiter: PerSessionBackupQueryRateLimiter
) {
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
private val outgoingRequestScope = CoroutineScope(SupervisorJob() + dispatcher)
@ -180,13 +181,15 @@ internal class OutgoingKeyRequestManager @Inject constructor(
}
}
fun onRoomKeyForwarded(sessionId: String,
fun onRoomKeyForwarded(
sessionId: String,
algorithm: String,
roomId: String,
senderKey: String,
fromDevice: String?,
fromIndex: Int,
event: Event) {
event: Event
) {
Timber.tag(loggerTag.value).d("Key forwarded for $sessionId from ${event.senderId}|$fromDevice at index $fromIndex")
outgoingRequestScope.launch {
sequencer.post {
@ -208,12 +211,14 @@ internal class OutgoingKeyRequestManager @Inject constructor(
}
}
fun onRoomKeyWithHeld(sessionId: String,
fun onRoomKeyWithHeld(
sessionId: String,
algorithm: String,
roomId: String,
senderKey: String,
fromDevice: String?,
event: Event) {
event: Event
) {
outgoingRequestScope.launch {
sequencer.post {
Timber.tag(loggerTag.value).d("Withheld received for $sessionId from ${event.senderId}|$fromDevice")

View file

@ -39,7 +39,8 @@ private val loggerTag = LoggerTag("EnsureOlmSessionsForDevicesAction", LoggerTag
internal class EnsureOlmSessionsForDevicesAction @Inject constructor(
private val olmDevice: MXOlmDevice,
private val coroutineDispatchers: MatrixCoroutineDispatchers,
private val oneTimeKeysForUsersDeviceTask: ClaimOneTimeKeysForUsersDeviceTask) {
private val oneTimeKeysForUsersDeviceTask: ClaimOneTimeKeysForUsersDeviceTask
) {
private val ensureMutex = Mutex()

View file

@ -23,9 +23,11 @@ import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import timber.log.Timber
import javax.inject.Inject
internal class EnsureOlmSessionsForUsersAction @Inject constructor(private val olmDevice: MXOlmDevice,
internal class EnsureOlmSessionsForUsersAction @Inject constructor(
private val olmDevice: MXOlmDevice,
private val cryptoStore: IMXCryptoStore,
private val ensureOlmSessionsForDevicesAction: EnsureOlmSessionsForDevicesAction) {
private val ensureOlmSessionsForDevicesAction: EnsureOlmSessionsForDevicesAction
) {
/**
* Try to make sure we have established olm sessions for the given users.

View file

@ -33,7 +33,8 @@ import javax.inject.Inject
private val loggerTag = LoggerTag("MegolmSessionDataImporter", LoggerTag.CRYPTO)
internal class MegolmSessionDataImporter @Inject constructor(private val olmDevice: MXOlmDevice,
internal class MegolmSessionDataImporter @Inject constructor(
private val olmDevice: MXOlmDevice,
private val roomDecryptorProvider: RoomDecryptorProvider,
private val outgoingKeyRequestManager: OutgoingKeyRequestManager,
private val cryptoStore: IMXCryptoStore,
@ -50,9 +51,11 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi
* @return import room keys result
*/
@WorkerThread
fun handle(megolmSessionsData: List<MegolmSessionData>,
fun handle(
megolmSessionsData: List<MegolmSessionData>,
fromBackup: Boolean,
progressListener: ProgressListener?): ImportRoomKeysResult {
progressListener: ProgressListener?
): ImportRoomKeysResult {
val t0 = clock.epochMillis()
val totalNumbersOfKeys = megolmSessionsData.size

View file

@ -36,7 +36,8 @@ internal class MessageEncrypter @Inject constructor(
private val userId: String,
@DeviceId
private val deviceId: String?,
private val olmDevice: MXOlmDevice) {
private val olmDevice: MXOlmDevice
) {
/**
* Encrypt an event payload for a list of devices.
* This method must be called from the getCryptoHandler() thread.

View file

@ -26,7 +26,8 @@ import javax.inject.Inject
internal class SetDeviceVerificationAction @Inject constructor(
private val cryptoStore: IMXCryptoStore,
@UserId private val userId: String,
private val defaultKeysBackupService: DefaultKeysBackupService) {
private val defaultKeysBackupService: DefaultKeysBackupService
) {
fun handle(trustLevel: DeviceTrustLevel, userId: String, deviceId: String) {
val device = cryptoStore.getUserDevice(userId, deviceId)

View file

@ -45,8 +45,10 @@ internal interface IMXGroupEncryption {
*
* @return true in case of success
*/
suspend fun reshareKey(groupSessionId: String,
suspend fun reshareKey(
groupSessionId: String,
userId: String,
deviceId: String,
senderKey: String): Boolean
senderKey: String
): Boolean
}

View file

@ -148,7 +148,8 @@ internal class MXMegolmDecryption(
throw MXCryptoError.Base(
MXCryptoError.ErrorType.KEYS_WITHHELD,
withHeldInfo.code?.value ?: "",
withHeldInfo.reason)
withHeldInfo.reason
)
}
if (requestKeysOnFail) {
@ -267,7 +268,8 @@ internal class MXMegolmDecryption(
senderKey = senderKey,
fromIndex = index,
fromDevice = fromDevice,
event = event)
event = event
)
cryptoStore.saveIncomingForwardKeyAuditTrail(
roomId = roomKeyContent.roomId,
@ -276,7 +278,8 @@ internal class MXMegolmDecryption(
algorithm = roomKeyContent.algorithm ?: "",
userId = event.senderId ?: "",
deviceId = fromDevice ?: "",
chainIndex = index.toLong())
chainIndex = index.toLong()
)
// The index is used to decide if we cancel sent request or if we wait for a better key
outgoingKeyRequestManager.postCancelRequestForSessionIfNeeded(roomKeyContent.sessionId, roomKeyContent.roomId, senderKey, index)

View file

@ -35,6 +35,7 @@ internal class MXMegolmDecryptionFactory @Inject constructor(
olmDevice,
outgoingKeyRequestManager,
cryptoStore,
eventsManager)
eventsManager
)
}
}

View file

@ -84,9 +84,11 @@ internal class MXMegolmEncryption(
private var sessionRotationPeriodMsgs: Int = 100
private var sessionRotationPeriodMs: Int = 7 * 24 * 3600 * 1000
override suspend fun encryptEventContent(eventContent: Content,
override suspend fun encryptEventContent(
eventContent: Content,
eventType: String,
userIds: List<String>): Content {
userIds: List<String>
): Content {
val ts = clock.epochMillis()
Timber.tag(loggerTag.value).v("encryptEventContent : getDevicesInRoom")
val devices = getDevicesInRoom(userIds)
@ -201,8 +203,10 @@ internal class MXMegolmEncryption(
* @param session the session info
* @param devicesByUsers the devices map
*/
private suspend fun shareKey(session: MXOutboundSessionInfo,
devicesByUsers: Map<String, List<CryptoDeviceInfo>>) {
private suspend fun shareKey(
session: MXOutboundSessionInfo,
devicesByUsers: Map<String, List<CryptoDeviceInfo>>
) {
// nothing to send, the task is done
if (devicesByUsers.isEmpty()) {
Timber.tag(loggerTag.value).v("shareKey() : nothing more to do")
@ -230,8 +234,10 @@ internal class MXMegolmEncryption(
* @param session the session info
* @param devicesByUser the devices map
*/
private suspend fun shareUserDevicesKey(session: MXOutboundSessionInfo,
devicesByUser: Map<String, List<CryptoDeviceInfo>>) {
private suspend fun shareUserDevicesKey(
session: MXOutboundSessionInfo,
devicesByUser: Map<String, List<CryptoDeviceInfo>>
) {
val sessionKey = olmDevice.getSessionKey(session.sessionId)
val chainIndex = olmDevice.getMessageIndex(session.sessionId)
@ -321,10 +327,12 @@ internal class MXMegolmEncryption(
}
}
private suspend fun notifyKeyWithHeld(targets: List<UserDevice>,
private suspend fun notifyKeyWithHeld(
targets: List<UserDevice>,
sessionId: String,
senderKey: String?,
code: WithHeldCode) {
code: WithHeldCode
) {
Timber.tag(loggerTag.value).d(
"notifyKeyWithHeld() :sending withheld for session:$sessionId and code $code to" +
" ${targets.joinToString { "${it.userId}|${it.deviceId}" }}"
@ -435,10 +443,12 @@ internal class MXMegolmEncryption(
}
}
override suspend fun reshareKey(groupSessionId: String,
override suspend fun reshareKey(
groupSessionId: String,
userId: String,
deviceId: String,
senderKey: String): Boolean {
senderKey: String
): Boolean {
Timber.tag(loggerTag.value).i("process reshareKey for $groupSessionId to $userId:$deviceId")
val deviceInfo = cryptoStore.getUserDevice(userId, deviceId) ?: return false
.also { Timber.tag(loggerTag.value).w("reshareKey: Device not found") }

View file

@ -23,7 +23,8 @@ import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
internal class SharedWithHelper(
private val roomId: String,
private val sessionId: String,
private val cryptoStore: IMXCryptoStore) {
private val cryptoStore: IMXCryptoStore
) {
fun sharedWithDevices(): MXUsersDevicesMap<Int> {
return cryptoStore.getSharedWithInfo(roomId, sessionId)

View file

@ -38,7 +38,8 @@ internal class MXOlmDecryption(
// The olm device interface
private val olmDevice: MXOlmDevice,
// the matrix userId
private val userId: String) :
private val userId: String
) :
IMXDecrypting {
@Throws(MXCryptoError::class)

View file

@ -20,8 +20,10 @@ import org.matrix.android.sdk.internal.crypto.MXOlmDevice
import org.matrix.android.sdk.internal.di.UserId
import javax.inject.Inject
internal class MXOlmDecryptionFactory @Inject constructor(private val olmDevice: MXOlmDevice,
@UserId private val userId: String) {
internal class MXOlmDecryptionFactory @Inject constructor(
private val olmDevice: MXOlmDevice,
@UserId private val userId: String
) {
fun create(): MXOlmDecryption {
return MXOlmDecryption(

View file

@ -32,7 +32,8 @@ internal class MXOlmEncryption(
private val cryptoStore: IMXCryptoStore,
private val messageEncrypter: MessageEncrypter,
private val deviceListManager: DeviceListManager,
private val ensureOlmSessionsForUsersAction: EnsureOlmSessionsForUsersAction) :
private val ensureOlmSessionsForUsersAction: EnsureOlmSessionsForUsersAction
) :
IMXEncrypting {
override suspend fun encryptEventContent(eventContent: Content, eventType: String, userIds: List<String>): Content {

View file

@ -24,12 +24,14 @@ import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import javax.inject.Inject
internal class MXOlmEncryptionFactory @Inject constructor(private val olmDevice: MXOlmDevice,
internal class MXOlmEncryptionFactory @Inject constructor(
private val olmDevice: MXOlmDevice,
private val cryptoStore: IMXCryptoStore,
private val messageEncrypter: MessageEncrypter,
private val deviceListManager: DeviceListManager,
private val coroutineDispatchers: MatrixCoroutineDispatchers,
private val ensureOlmSessionsForUsersAction: EnsureOlmSessionsForUsersAction) {
private val ensureOlmSessionsForUsersAction: EnsureOlmSessionsForUsersAction
) {
fun create(roomId: String): MXOlmEncryption {
return MXOlmEncryption(

View file

@ -117,9 +117,11 @@ internal interface CryptoApi {
* @param body the body
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "sendToDevice/{eventType}/{txnId}")
suspend fun sendToDevice(@Path("eventType") eventType: String,
suspend fun sendToDevice(
@Path("eventType") eventType: String,
@Path("txnId") transactionId: String,
@Body body: SendToDeviceBody)
@Body body: SendToDeviceBody
)
/**
* Delete a device.
@ -129,8 +131,10 @@ internal interface CryptoApi {
* @param params the deletion parameters
*/
@HTTP(path = NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices/{device_id}", method = "DELETE", hasBody = true)
suspend fun deleteDevice(@Path("device_id") deviceId: String,
@Body params: DeleteDeviceParams)
suspend fun deleteDevice(
@Path("device_id") deviceId: String,
@Body params: DeleteDeviceParams
)
/**
* Update the device information.
@ -140,8 +144,10 @@ internal interface CryptoApi {
* @param params the params
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices/{device_id}")
suspend fun updateDeviceInfo(@Path("device_id") deviceId: String,
@Body params: UpdateDeviceInfoBody)
suspend fun updateDeviceInfo(
@Path("device_id") deviceId: String,
@Body params: UpdateDeviceInfoBody
)
/**
* Get the update devices list from two sync token.
@ -151,6 +157,8 @@ internal interface CryptoApi {
* @param newToken the up-to token.
*/
@GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "keys/changes")
suspend fun getKeyChanges(@Query("from") oldToken: String,
@Query("to") newToken: String): KeyChangesResponse
suspend fun getKeyChanges(
@Query("from") oldToken: String,
@Query("to") newToken: String
): KeyChangesResponse
}

View file

@ -41,10 +41,12 @@ internal object MXEncryptedAttachments {
private const val SECRET_KEY_SPEC_ALGORITHM = "AES"
private const val MESSAGE_DIGEST_ALGORITHM = "SHA-256"
fun encrypt(clearStream: InputStream,
fun encrypt(
clearStream: InputStream,
outputFile: File,
clock: Clock,
progress: ((current: Int, total: Int) -> Unit)): EncryptedFileInfo {
progress: ((current: Int, total: Int) -> Unit)
): EncryptedFileInfo {
val t0 = clock.epochMillis()
val secureRandom = SecureRandom()
val initVectorBytes = ByteArray(16) { 0.toByte() }
@ -236,7 +238,8 @@ internal object MXEncryptedAttachments {
* @param clock a clock to retrieve current time
* @return true in case of success, false in case of error
*/
fun decryptAttachment(attachmentStream: InputStream?,
fun decryptAttachment(
attachmentStream: InputStream?,
elementToDecrypt: ElementToDecrypt?,
outputStream: OutputStream,
clock: Clock

View file

@ -261,7 +261,8 @@ internal class DefaultCrossSigningService @Inject constructor(
}
}
override fun checkTrustFromPrivateKeys(masterKeyPrivateKey: String?,
override fun checkTrustFromPrivateKeys(
masterKeyPrivateKey: String?,
uskKeyPrivateKey: String?,
sskPrivateKey: String?
): UserTrustResult {

View file

@ -276,10 +276,12 @@ internal class UpdateTrustWorker(context: Context, params: WorkerParameters, ses
}
}
private fun computeRoomShield(myCrossSigningInfo: MXCrossSigningInfo?,
private fun computeRoomShield(
myCrossSigningInfo: MXCrossSigningInfo?,
cryptoRealm: Realm,
activeMemberUserIds: List<String>,
roomSummaryEntity: RoomSummaryEntity): RoomEncryptionTrustLevel {
roomSummaryEntity: RoomSummaryEntity
): RoomEncryptionTrustLevel {
Timber.v("## CrossSigning - computeRoomShield ${roomSummaryEntity.roomId} -> ${activeMemberUserIds.logLimit()}")
// The set of “all users” depends on the type of room:
// For regular / topic rooms which have more than 2 members (including yourself) are considered when decorating a room

View file

@ -157,9 +157,11 @@ internal class DefaultKeysBackupService @Inject constructor(
keysBackupStateManager.removeListener(listener)
}
override fun prepareKeysBackupVersion(password: String?,
override fun prepareKeysBackupVersion(
password: String?,
progressListener: ProgressListener?,
callback: MatrixCallback<MegolmBackupCreationInfo>) {
callback: MatrixCallback<MegolmBackupCreationInfo>
) {
cryptoCoroutineScope.launch(coroutineDispatchers.io) {
try {
val olmPkDecryption = OlmPkDecryption()
@ -233,8 +235,10 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun createKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>) {
override fun createKeysBackupVersion(
keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>
) {
@Suppress("UNCHECKED_CAST")
val createKeysBackupVersionBody = CreateKeysBackupVersionBody(
algorithm = keysBackupCreationInfo.algorithm,
@ -345,8 +349,10 @@ internal class DefaultKeysBackupService @Inject constructor(
return cryptoStore.inboundGroupSessionsCount(true)
}
override fun backupAllGroupSessions(progressListener: ProgressListener?,
callback: MatrixCallback<Unit>?) {
override fun backupAllGroupSessions(
progressListener: ProgressListener?,
callback: MatrixCallback<Unit>?
) {
if (!isEnabled || backupOlmPkEncryption == null || keysBackupVersion == null) {
callback?.onFailure(Throwable("Backup not enabled"))
return
@ -397,8 +403,10 @@ internal class DefaultKeysBackupService @Inject constructor(
})
}
override fun getKeysBackupTrust(keysBackupVersion: KeysVersionResult,
callback: MatrixCallback<KeysBackupVersionTrust>) {
override fun getKeysBackupTrust(
keysBackupVersion: KeysVersionResult,
callback: MatrixCallback<KeysBackupVersionTrust>
) {
// TODO Validate with François that this is correct
object : Task<KeysVersionResult, KeysBackupVersionTrust> {
override suspend fun execute(params: KeysVersionResult): KeysBackupVersionTrust {
@ -505,9 +513,11 @@ internal class DefaultKeysBackupService @Inject constructor(
)
}
override fun trustKeysBackupVersion(keysBackupVersion: KeysVersionResult,
override fun trustKeysBackupVersion(
keysBackupVersion: KeysVersionResult,
trust: Boolean,
callback: MatrixCallback<Unit>) {
callback: MatrixCallback<Unit>
) {
Timber.v("trustKeyBackupVersion: $trust, version ${keysBackupVersion.version}")
// Get auth data to update it
@ -589,9 +599,11 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun trustKeysBackupVersionWithRecoveryKey(keysBackupVersion: KeysVersionResult,
override fun trustKeysBackupVersionWithRecoveryKey(
keysBackupVersion: KeysVersionResult,
recoveryKey: String,
callback: MatrixCallback<Unit>) {
callback: MatrixCallback<Unit>
) {
Timber.v("trustKeysBackupVersionWithRecoveryKey: version ${keysBackupVersion.version}")
cryptoCoroutineScope.launch(coroutineDispatchers.io) {
@ -608,9 +620,11 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun trustKeysBackupVersionWithPassphrase(keysBackupVersion: KeysVersionResult,
override fun trustKeysBackupVersionWithPassphrase(
keysBackupVersion: KeysVersionResult,
password: String,
callback: MatrixCallback<Unit>) {
callback: MatrixCallback<Unit>
) {
Timber.v("trustKeysBackupVersionWithPassphrase: version ${keysBackupVersion.version}")
cryptoCoroutineScope.launch(coroutineDispatchers.io) {
@ -707,12 +721,14 @@ internal class DefaultKeysBackupService @Inject constructor(
progressListener.onProgress(backedUpKeys, total)
}
override fun restoreKeysWithRecoveryKey(keysVersionResult: KeysVersionResult,
override fun restoreKeysWithRecoveryKey(
keysVersionResult: KeysVersionResult,
recoveryKey: String,
roomId: String?,
sessionId: String?,
stepProgressListener: StepProgressListener?,
callback: MatrixCallback<ImportRoomKeysResult>) {
callback: MatrixCallback<ImportRoomKeysResult>
) {
Timber.v("restoreKeysWithRecoveryKey: From backup version: ${keysVersionResult.version}")
cryptoCoroutineScope.launch(coroutineDispatchers.io) {
@ -806,12 +822,14 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun restoreKeyBackupWithPassword(keysBackupVersion: KeysVersionResult,
override fun restoreKeyBackupWithPassword(
keysBackupVersion: KeysVersionResult,
password: String,
roomId: String?,
sessionId: String?,
stepProgressListener: StepProgressListener?,
callback: MatrixCallback<ImportRoomKeysResult>) {
callback: MatrixCallback<ImportRoomKeysResult>
) {
Timber.v("[MXKeyBackup] restoreKeyBackup with password: From backup version: ${keysBackupVersion.version}")
cryptoCoroutineScope.launch(coroutineDispatchers.io) {
@ -859,9 +877,11 @@ internal class DefaultKeysBackupService @Inject constructor(
* Same method as [RoomKeysRestClient.getRoomKey] except that it accepts nullable
* parameters and always returns a KeysBackupData object through the Callback.
*/
private suspend fun getKeys(sessionId: String?,
private suspend fun getKeys(
sessionId: String?,
roomId: String?,
version: String): KeysBackupData {
version: String
): KeysBackupData {
return if (roomId != null && sessionId != null) {
// Get key for the room and for the session
val data = getRoomSessionDataTask.execute(GetRoomSessionDataTask.Params(roomId, sessionId, version))
@ -939,8 +959,10 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun getVersion(version: String,
callback: MatrixCallback<KeysVersionResult?>) {
override fun getVersion(
version: String,
callback: MatrixCallback<KeysVersionResult?>
) {
getKeysBackupVersionTask
.configureWith(version) {
this.callback = object : MatrixCallback<KeysVersionResult> {
@ -1179,10 +1201,12 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
override fun computePrivateKey(passphrase: String,
override fun computePrivateKey(
passphrase: String,
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray {
progressListener: ProgressListener
): ByteArray {
return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
}
@ -1482,8 +1506,10 @@ internal class DefaultKeysBackupService @Inject constructor(
get() = cryptoStore
@VisibleForTesting
fun createFakeKeysBackupVersion(keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>) {
fun createFakeKeysBackupVersion(
keysBackupCreationInfo: MegolmBackupCreationInfo,
callback: MatrixCallback<KeysVersion>
) {
@Suppress("UNCHECKED_CAST")
val createKeysBackupVersionBody = CreateKeysBackupVersionBody(
algorithm = keysBackupCreationInfo.algorithm,

View file

@ -49,7 +49,8 @@ internal data class GeneratePrivateKeyResult(
* @return a {privateKey, salt, iterations} tuple.
*/
@WorkerThread
internal fun generatePrivateKeyWithPassword(password: String,
internal fun generatePrivateKeyWithPassword(
password: String,
progressListener: ProgressListener?
): GeneratePrivateKeyResult {
val salt = generateSalt()
@ -70,10 +71,12 @@ internal fun generatePrivateKeyWithPassword(password: String,
* @return a private key.
*/
@WorkerThread
internal fun retrievePrivateKeyWithPassword(password: String,
internal fun retrievePrivateKeyWithPassword(
password: String,
salt: String,
iterations: Int,
progressListener: ProgressListener? = null): ByteArray {
progressListener: ProgressListener? = null
): ByteArray {
return deriveKey(password, salt, iterations, progressListener)
}
@ -88,10 +91,12 @@ internal fun retrievePrivateKeyWithPassword(password: String,
* @return a private key.
*/
@WorkerThread
internal fun deriveKey(password: String,
internal fun deriveKey(
password: String,
salt: String,
iterations: Int,
progressListener: ProgressListener?): ByteArray {
progressListener: ProgressListener?
): ByteArray {
// Note: copied and adapted from MXMegolmExportEncryption
// based on https://en.wikipedia.org/wiki/PBKDF2 algorithm
// it is simpler than the generic algorithm because the expected key length is equal to the mac key length.

View file

@ -71,8 +71,10 @@ internal interface RoomKeysApi {
* @param updateKeysBackupVersionBody the body
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version/{version}")
suspend fun updateKeysBackupVersion(@Path("version") version: String,
@Body updateKeysBackupVersionBody: UpdateKeysBackupVersionBody)
suspend fun updateKeysBackupVersion(
@Path("version") version: String,
@Body updateKeysBackupVersionBody: UpdateKeysBackupVersionBody
)
/* ==========================================================================================
* Storing keys
@ -93,10 +95,12 @@ internal interface RoomKeysApi {
* @param keyBackupData the data to send
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}")
suspend fun storeRoomSessionData(@Path("roomId") roomId: String,
suspend fun storeRoomSessionData(
@Path("roomId") roomId: String,
@Path("sessionId") sessionId: String,
@Query("version") version: String,
@Body keyBackupData: KeyBackupData): BackupKeysResult
@Body keyBackupData: KeyBackupData
): BackupKeysResult
/**
* Store several keys for the given room, using the given backup version.
@ -106,9 +110,11 @@ internal interface RoomKeysApi {
* @param roomKeysBackupData the data to send
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}")
suspend fun storeRoomSessionsData(@Path("roomId") roomId: String,
suspend fun storeRoomSessionsData(
@Path("roomId") roomId: String,
@Query("version") version: String,
@Body roomKeysBackupData: RoomKeysBackupData): BackupKeysResult
@Body roomKeysBackupData: RoomKeysBackupData
): BackupKeysResult
/**
* Store several keys, using the given backup version.
@ -117,8 +123,10 @@ internal interface RoomKeysApi {
* @param keysBackupData the data to send
*/
@PUT(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys")
suspend fun storeSessionsData(@Query("version") version: String,
@Body keysBackupData: KeysBackupData): BackupKeysResult
suspend fun storeSessionsData(
@Query("version") version: String,
@Body keysBackupData: KeysBackupData
): BackupKeysResult
/* ==========================================================================================
* Retrieving keys
@ -132,9 +140,11 @@ internal interface RoomKeysApi {
* @param version the version of the backup, or empty String to retrieve the last version
*/
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}")
suspend fun getRoomSessionData(@Path("roomId") roomId: String,
suspend fun getRoomSessionData(
@Path("roomId") roomId: String,
@Path("sessionId") sessionId: String,
@Query("version") version: String): KeyBackupData
@Query("version") version: String
): KeyBackupData
/**
* Retrieve all the keys for the given room from the backup.
@ -143,8 +153,10 @@ internal interface RoomKeysApi {
* @param version the version of the backup, or empty String to retrieve the last version
*/
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}")
suspend fun getRoomSessionsData(@Path("roomId") roomId: String,
@Query("version") version: String): RoomKeysBackupData
suspend fun getRoomSessionsData(
@Path("roomId") roomId: String,
@Query("version") version: String
): RoomKeysBackupData
/**
* Retrieve all the keys from the backup.
@ -162,16 +174,20 @@ internal interface RoomKeysApi {
* Deletes keys from the backup.
*/
@DELETE(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}")
suspend fun deleteRoomSessionData(@Path("roomId") roomId: String,
suspend fun deleteRoomSessionData(
@Path("roomId") roomId: String,
@Path("sessionId") sessionId: String,
@Query("version") version: String)
@Query("version") version: String
)
/**
* Deletes keys from the backup.
*/
@DELETE(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}")
suspend fun deleteRoomSessionsData(@Path("roomId") roomId: String,
@Query("version") version: String)
suspend fun deleteRoomSessionsData(
@Path("roomId") roomId: String,
@Query("version") version: String
)
/**
* Deletes keys from the backup.

View file

@ -69,12 +69,14 @@ internal data class KeyVerificationAccept(
override fun toSendToDeviceObject() = this
companion object : VerificationInfoAcceptFactory {
override fun create(tid: String,
override fun create(
tid: String,
keyAgreementProtocol: String,
hash: String,
commitment: String,
messageAuthenticationCode: String,
shortAuthenticationStrings: List<String>): VerificationInfoAccept {
shortAuthenticationStrings: List<String>
): VerificationInfoAccept {
return KeyVerificationAccept(
transactionId = tid,
keyAgreementProtocol = keyAgreementProtocol,

View file

@ -62,10 +62,12 @@ internal class DefaultSharedSecretStorageService @Inject constructor(
private val cryptoCoroutineScope: CoroutineScope
) : SharedSecretStorageService {
override suspend fun generateKey(keyId: String,
override suspend fun generateKey(
keyId: String,
key: SsssKeySpec?,
keyName: String,
keySigner: KeySigner?): SsssKeyCreationInfo {
keySigner: KeySigner?
): SsssKeyCreationInfo {
return withContext(cryptoCoroutineScope.coroutineContext + coroutineDispatchers.computation) {
val bytes = (key as? RawBytesKeySpec)?.privateKey
?: ByteArray(32).also {
@ -94,11 +96,13 @@ internal class DefaultSharedSecretStorageService @Inject constructor(
}
}
override suspend fun generateKeyWithPassphrase(keyId: String,
override suspend fun generateKeyWithPassphrase(
keyId: String,
keyName: String,
passphrase: String,
keySigner: KeySigner,
progressListener: ProgressListener?): SsssKeyCreationInfo {
progressListener: ProgressListener?
): SsssKeyCreationInfo {
return withContext(cryptoCoroutineScope.coroutineContext + coroutineDispatchers.computation) {
val privatePart = generatePrivateKeyWithPassword(passphrase, progressListener)

View file

@ -192,10 +192,12 @@ internal interface IMXCryptoStore {
*/
fun storeUserDevices(userId: String, devices: Map<String, CryptoDeviceInfo>?)
fun storeUserCrossSigningKeys(userId: String,
fun storeUserCrossSigningKeys(
userId: String,
masterKey: CryptoCrossSigningKey?,
selfSigningKey: CryptoCrossSigningKey?,
userSigningKey: CryptoCrossSigningKey?)
userSigningKey: CryptoCrossSigningKey?
)
/**
* Retrieve the known devices for a user.
@ -392,7 +394,8 @@ internal interface IMXCryptoStore {
algorithm: String,
senderKey: String,
fromDevice: String?,
event: Event)
event: Event
)
fun deleteOutgoingRoomKeyRequest(requestId: String)
fun deleteOutgoingRoomKeyRequestInState(state: OutgoingRoomKeyRequestState)
@ -479,8 +482,10 @@ internal interface IMXCryptoStore {
fun addWithHeldMegolmSession(withHeldContent: RoomKeyWithHeldContent)
fun getWithHeldMegolmSession(roomId: String, sessionId: String): RoomKeyWithHeldContent?
fun markedSessionAsShared(roomId: String?, sessionId: String, userId: String, deviceId: String,
deviceIdentityKey: String, chainIndex: Int)
fun markedSessionAsShared(
roomId: String?, sessionId: String, userId: String, deviceId: String,
deviceIdentityKey: String, chainIndex: Int
)
/**
* Query for information on this session sharing history.

View file

@ -322,10 +322,12 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun storeUserCrossSigningKeys(userId: String,
override fun storeUserCrossSigningKeys(
userId: String,
masterKey: CryptoCrossSigningKey?,
selfSigningKey: CryptoCrossSigningKey?,
userSigningKey: CryptoCrossSigningKey?) {
userSigningKey: CryptoCrossSigningKey?
) {
doRealmTransaction(realmConfiguration) { realm ->
UserEntity.getOrCreate(realm, userId)
.let { userEntity ->
@ -1154,9 +1156,11 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun getOrAddOutgoingRoomKeyRequest(requestBody: RoomKeyRequestBody,
override fun getOrAddOutgoingRoomKeyRequest(
requestBody: RoomKeyRequestBody,
recipients: Map<String, List<String>>,
fromIndex: Int): OutgoingKeyRequest {
fromIndex: Int
): OutgoingKeyRequest {
// Insert the request and return the one passed in parameter
lateinit var request: OutgoingKeyRequest
doRealmTransaction(realmConfiguration) { realm ->
@ -1220,12 +1224,14 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun updateOutgoingRoomKeyReply(roomId: String,
override fun updateOutgoingRoomKeyReply(
roomId: String,
sessionId: String,
algorithm: String,
senderKey: String,
fromDevice: String?,
event: Event) {
event: Event
) {
doRealmTransaction(realmConfiguration) { realm ->
realm.where<OutgoingKeyRequestEntity>()
.equalTo(OutgoingKeyRequestEntityFields.ROOM_ID, roomId)
@ -1266,7 +1272,8 @@ internal class RealmCryptoStore @Inject constructor(
senderKey: String,
algorithm: String,
fromUser: String,
fromDevice: String) {
fromDevice: String
) {
monarchy.writeAsync { realm ->
val now = clock.epochMillis()
realm.createObject<AuditTrailEntity>().apply {
@ -1288,13 +1295,15 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun saveWithheldAuditTrail(roomId: String,
override fun saveWithheldAuditTrail(
roomId: String,
sessionId: String,
senderKey: String,
algorithm: String,
code: WithHeldCode,
userId: String,
deviceId: String) {
deviceId: String
) {
monarchy.writeAsync { realm ->
val now = clock.epochMillis()
realm.createObject<AuditTrailEntity>().apply {
@ -1316,27 +1325,32 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun saveForwardKeyAuditTrail(roomId: String,
override fun saveForwardKeyAuditTrail(
roomId: String,
sessionId: String,
senderKey: String,
algorithm: String,
userId: String,
deviceId: String,
chainIndex: Long?) {
chainIndex: Long?
) {
saveForwardKeyTrail(roomId, sessionId, senderKey, algorithm, userId, deviceId, chainIndex, false)
}
override fun saveIncomingForwardKeyAuditTrail(roomId: String,
override fun saveIncomingForwardKeyAuditTrail(
roomId: String,
sessionId: String,
senderKey: String,
algorithm: String,
userId: String,
deviceId: String,
chainIndex: Long?) {
chainIndex: Long?
) {
saveForwardKeyTrail(roomId, sessionId, senderKey, algorithm, userId, deviceId, chainIndex, true)
}
private fun saveForwardKeyTrail(roomId: String,
private fun saveForwardKeyTrail(
roomId: String,
sessionId: String,
senderKey: String,
algorithm: String,
@ -1617,12 +1631,14 @@ internal class RealmCryptoStore @Inject constructor(
}
}
override fun markedSessionAsShared(roomId: String?,
override fun markedSessionAsShared(
roomId: String?,
sessionId: String,
userId: String,
deviceId: String,
deviceIdentityKey: String,
chainIndex: Int) {
chainIndex: Int
) {
doRealmTransaction(realmConfiguration) { realm ->
SharedSessionEntity.create(
realm = realm,

View file

@ -33,7 +33,8 @@ internal open class OlmInboundGroupSessionEntity(
// olmInboundGroupSessionData contains Json
var olmInboundGroupSessionData: String? = null,
// Indicate if the key has been backed up to the homeserver
var backedUp: Boolean = false) :
var backedUp: Boolean = false
) :
RealmObject() {
fun getInboundGroupSession(): OlmInboundGroupSessionWrapper2? {

View file

@ -25,11 +25,13 @@ import org.matrix.olm.OlmSession
internal fun OlmSessionEntity.Companion.createPrimaryKey(sessionId: String, deviceKey: String) = "$sessionId|$deviceKey"
// olmSessionData is a serialized OlmSession
internal open class OlmSessionEntity(@PrimaryKey var primaryKey: String = "",
internal open class OlmSessionEntity(
@PrimaryKey var primaryKey: String = "",
var sessionId: String? = null,
var deviceKey: String? = null,
var olmSessionData: String? = null,
var lastReceivedMessageTs: Long = 0) :
var lastReceivedMessageTs: Long = 0
) :
RealmObject() {
fun getOlmSession(): OlmSession? {

View file

@ -24,12 +24,14 @@ import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.internal.crypto.store.db.model.SharedSessionEntity
import org.matrix.android.sdk.internal.crypto.store.db.model.SharedSessionEntityFields
internal fun SharedSessionEntity.Companion.get(realm: Realm,
internal fun SharedSessionEntity.Companion.get(
realm: Realm,
roomId: String?,
sessionId: String,
userId: String,
deviceId: String,
deviceIdentityKey: String?): SharedSessionEntity? {
deviceIdentityKey: String?
): SharedSessionEntity? {
return realm.where<SharedSessionEntity>()
.equalTo(SharedSessionEntityFields.ROOM_ID, roomId)
.equalTo(SharedSessionEntityFields.SESSION_ID, sessionId)
@ -48,12 +50,14 @@ internal fun SharedSessionEntity.Companion.get(realm: Realm, roomId: String?, se
.findAll()
}
internal fun SharedSessionEntity.Companion.create(realm: Realm, roomId: String?,
internal fun SharedSessionEntity.Companion.create(
realm: Realm, roomId: String?,
sessionId: String,
userId: String,
deviceId: String,
deviceIdentityKey: String,
chainIndex: Int): SharedSessionEntity {
chainIndex: Int
): SharedSessionEntity {
return realm.createObject<SharedSessionEntity>().apply {
this.roomId = roomId
this.algorithm = MXCRYPTO_ALGORITHM_MEGOLM

Some files were not shown because too many files have changed in this diff Show more