From a9c474105acc392bff8397f77141ec34017a260d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Oct 2019 16:10:53 +0200 Subject: [PATCH] Fix warnings in the SDK --- .../android/api/session/events/model/Event.kt | 1 + .../internal/crypto/DefaultCryptoService.kt | 16 +++------- .../android/internal/crypto/MXOlmDevice.kt | 21 ++++++------ .../internal/crypto/RoomDecryptorProvider.kt | 3 +- .../crypto/actions/MessageEncrypter.kt | 2 +- .../algorithms/megolm/MXMegolmEncryption.kt | 2 +- .../crypto/algorithms/olm/MXOlmDecryption.kt | 14 ++++---- .../attachments/MXEncryptedAttachments.kt | 4 +-- .../internal/crypto/keysbackup/KeysBackup.kt | 32 ++++++++++--------- .../model/rest/KeysAlgorithmAndData.kt | 3 +- .../android/internal/crypto/model/MXKey.kt | 1 + .../internal/crypto/store/IMXCryptoStore.kt | 2 +- .../internal/crypto/store/db/Helper.kt | 1 + .../crypto/store/db/RealmCryptoStore.kt | 9 ++---- .../mapper/EventAnnotationsSummaryMapper.kt | 2 +- .../internal/database/mapper/EventMapper.kt | 23 +++++++------ .../internal/network/UserAgentHolder.kt | 2 +- .../android/internal/network/ssl/CertUtil.kt | 13 ++++---- .../network/ssl/PinnedTrustManager.kt | 30 ++++++++--------- .../internal/session/content/FileUploader.kt | 14 +++++--- .../session/room/prune/EventsPruner.kt | 7 +--- .../session/room/prune/PruneEventTask.kt | 13 ++++---- .../session/room/send/EncryptEventWorker.kt | 2 +- .../room/send/LocalEchoEventFactory.kt | 10 +++--- .../room/timeline/DefaultTimelineService.kt | 2 +- .../securestorage/SecretStoringUtils.kt | 23 +++++++------ .../internal/session/sync/RoomSyncHandler.kt | 18 +++-------- .../android/internal/util/CompatUtil.kt | 20 ++++-------- .../android/internal/util/StringUtils.kt | 11 ++++--- 29 files changed, 142 insertions(+), 159 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt index 902515a239..eca5d8d8f4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt @@ -136,6 +136,7 @@ data class Event( * @return the event content */ fun getClearContent(): Content? { + @Suppress("UNCHECKED_CAST") return mxDecryptionResult?.payload?.get("content") as? Content ?: content } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt index 1a94bebde4..51234082e0 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt @@ -31,9 +31,7 @@ import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.listeners.ProgressListener import im.vector.matrix.android.api.session.crypto.CryptoService import im.vector.matrix.android.api.session.crypto.MXCryptoError -import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupService import im.vector.matrix.android.api.session.crypto.keyshare.RoomKeysRequestListener -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationService import im.vector.matrix.android.api.session.events.model.Content import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType @@ -289,24 +287,18 @@ internal class DefaultCryptoService @Inject constructor( outgoingRoomKeyRequestManager.stop() } - override fun isCryptoEnabled(): Boolean { - // TODO Check that this test is correct - return olmDevice != null - } + // Aways enabled on RiotX + override fun isCryptoEnabled() = true /** * @return the Keys backup Service */ - override fun getKeysBackupService(): KeysBackupService { - return keysBackup - } + override fun getKeysBackupService() = keysBackup /** * @return the SasVerificationService */ - override fun getSasVerificationService(): SasVerificationService { - return sasVerificationService - } + override fun getSasVerificationService() = sasVerificationService /** * A sync response has been received diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/MXOlmDevice.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/MXOlmDevice.kt index 7c5131fcce..4d4ae35265 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/MXOlmDevice.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/MXOlmDevice.kt @@ -250,7 +250,7 @@ internal class MXOlmDevice @Inject constructor( return null } - Timber.v("## createInboundSession() : sessionId: " + olmSession.sessionIdentifier()) + Timber.v("## createInboundSession() : sessionId: ${olmSession.sessionIdentifier()}") try { olmAccount!!.removeOneTimeKeys(olmSession) @@ -262,7 +262,7 @@ internal class MXOlmDevice @Inject constructor( Timber.v("## createInboundSession() : ciphertext: $ciphertext") try { val sha256 = olmUtility!!.sha256(URLEncoder.encode(ciphertext, "utf-8")) - Timber.v("## createInboundSession() :ciphertext: SHA256:" + sha256) + Timber.v("## createInboundSession() :ciphertext: SHA256: $sha256") } catch (e: Exception) { Timber.e(e, "## createInboundSession() :ciphertext: cannot encode ciphertext") } @@ -352,7 +352,7 @@ internal class MXOlmDevice @Inject constructor( res["body"] = olmMessage.mCipherText res["type"] = olmMessage.mType } catch (e: Exception) { - Timber.e(e, "## encryptMessage() : failed " + e.message) + Timber.e(e, "## encryptMessage() : failed") } } @@ -384,7 +384,7 @@ internal class MXOlmDevice @Inject constructor( olmSessionWrapper.onMessageReceived() store.storeSession(olmSessionWrapper, theirDeviceIdentityKey) } catch (e: Exception) { - Timber.e(e, "## decryptMessage() : decryptMessage failed " + e.message) + Timber.e(e, "## decryptMessage() : decryptMessage failed") } } @@ -425,7 +425,7 @@ internal class MXOlmDevice @Inject constructor( outboundGroupSessionStore[session.sessionIdentifier()] = session return session.sessionIdentifier() } catch (e: Exception) { - Timber.e(e, "createOutboundGroupSession " + e.message) + Timber.e(e, "createOutboundGroupSession") session?.releaseSession() } @@ -444,7 +444,7 @@ internal class MXOlmDevice @Inject constructor( try { return outboundGroupSessionStore[sessionId]!!.sessionKey() } catch (e: Exception) { - Timber.e(e, "## getSessionKey() : failed " + e.message) + Timber.e(e, "## getSessionKey() : failed") } } @@ -475,7 +475,7 @@ internal class MXOlmDevice @Inject constructor( try { return outboundGroupSessionStore[sessionId]!!.encryptMessage(payloadString) } catch (e: Exception) { - Timber.e(e, "## encryptGroupMessage() : failed " + e.message) + Timber.e(e, "## encryptGroupMessage() : failed") } } @@ -583,7 +583,7 @@ internal class MXOlmDevice @Inject constructor( try { if (!TextUtils.equals(session.olmInboundGroupSession?.sessionIdentifier(), sessionId)) { - Timber.e("## importInboundGroupSession : ERROR: Mismatched group session ID from senderKey: " + senderKey!!) + Timber.e("## importInboundGroupSession : ERROR: Mismatched group session ID from senderKey: $senderKey") if (session.olmInboundGroupSession != null) session.olmInboundGroupSession!!.releaseSession() continue } @@ -652,9 +652,8 @@ internal class MXOlmDevice @Inject constructor( // Check that the room id matches the original one for the session. This stops // the HS pretending a message was targeting a different room. if (roomId == session.roomId) { - var decryptResult: OlmInboundGroupSession.DecryptMessageResult? = null - try { - decryptResult = session.olmInboundGroupSession!!.decryptMessage(body) + val decryptResult = try { + session.olmInboundGroupSession!!.decryptMessage(body) } catch (e: OlmException) { Timber.e(e, "## decryptGroupMessage () : decryptMessage failed") throw MXCryptoError.OlmError(e) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/RoomDecryptorProvider.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/RoomDecryptorProvider.kt index 3dd7b932f9..0d49482401 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/RoomDecryptorProvider.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/RoomDecryptorProvider.kt @@ -76,7 +76,8 @@ internal class RoomDecryptorProvider @Inject constructor( val alg = when (algorithm) { MXCRYPTO_ALGORITHM_MEGOLM -> megolmDecryptionFactory.create().apply { this.newSessionListener = object : NewSessionListener { - override fun onNewSession(rid: String?, senderKey: String, sessionId: String) { + override fun onNewSession(roomId: String?, senderKey: String, sessionId: String) { + // PR reviewer: the parameter has been renamed so is now in conflict with the parameter of getOrCreateRoomDecryptor newSessionListeners.forEach { try { it.onNewSession(roomId, senderKey, sessionId) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MessageEncrypter.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MessageEncrypter.kt index 3328de0eaf..980f620075 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MessageEncrypter.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MessageEncrypter.kt @@ -81,7 +81,7 @@ internal class MessageEncrypter @Inject constructor(private val credentials: Cre payloadJson["recipient_keys"] = recipientsKeysMap val payloadString = convertToUTF8(JsonCanonicalizer.getCanonicalJson(Map::class.java, payloadJson)) - ciphertext[deviceKey] = olmDevice.encryptMessage(deviceKey, sessionId!!, payloadString!!)!! + ciphertext[deviceKey] = olmDevice.encryptMessage(deviceKey, sessionId!!, payloadString)!! } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt index b465cb6e67..d6c7d33131 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt @@ -253,7 +253,7 @@ internal class MXMegolmEncryption( // Get canonical Json from val payloadString = convertToUTF8(JsonCanonicalizer.getCanonicalJson(Map::class.java, payloadJson)) - val ciphertext = olmDevice.encryptGroupMessage(session.sessionId, payloadString!!) + val ciphertext = olmDevice.encryptGroupMessage(session.sessionId, payloadString) val map = HashMap() map["algorithm"] = MXCRYPTO_ALGORITHM_MEGOLM diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt index 9433e364cb..2f3b8a8f4a 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt @@ -63,6 +63,7 @@ internal class MXOlmDecryption( } // The message for myUser + @Suppress("UNCHECKED_CAST") val message = messageAny as JsonDict val decryptedPayload = decryptMessage(message, senderKey) @@ -72,10 +73,6 @@ internal class MXOlmDecryption( throw MXCryptoError.Base(MXCryptoError.ErrorType.BAD_ENCRYPTED_MESSAGE, MXCryptoError.BAD_ENCRYPTED_MESSAGE_REASON) } val payloadString = convertFromUTF8(decryptedPayload) - if (payloadString == null) { - Timber.e("## decryptEvent() Failed to decrypt Olm event (id= ${event.eventId} from $senderKey") - throw MXCryptoError.Base(MXCryptoError.ErrorType.BAD_ENCRYPTED_MESSAGE, MXCryptoError.BAD_ENCRYPTED_MESSAGE_REASON) - } val adapter = MoshiProvider.providesMoshi().adapter(JSON_DICT_PARAMETERIZED_TYPE) val payload = adapter.fromJson(payloadString) @@ -104,7 +101,8 @@ internal class MXOlmDecryption( } val recipientKeys = olmPayloadContent.recipient_keys ?: run { - Timber.e("## decryptEvent() : Olm event (id=${event.eventId}) contains no 'recipient_keys' property; cannot prevent unknown-key attack") + Timber.e("## decryptEvent() : Olm event (id=${event.eventId}) contains no 'recipient_keys'" + + " property; cannot prevent unknown-key attack") throw MXCryptoError.Base(MXCryptoError.ErrorType.MISSING_PROPERTY, String.format(MXCryptoError.ERROR_MISSING_PROPERTY_REASON, "recipient_keys")) } @@ -161,9 +159,9 @@ internal class MXOlmDecryption( val messageBody = message["body"] as? String ?: return null val messageType = when (val typeAsVoid = message["type"]) { is Double -> typeAsVoid.toInt() - is Int -> typeAsVoid - is Long -> typeAsVoid.toInt() - else -> return null + is Int -> typeAsVoid + is Long -> typeAsVoid.toInt() + else -> return null } // Try each session in turn diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt index 95ff11d595..5f90b636ac 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt @@ -103,10 +103,10 @@ object MXEncryptedAttachments { ext = true, key_ops = listOf("encrypt", "decrypt"), kty = "oct", - k = base64ToBase64Url(Base64.encodeToString(key, Base64.DEFAULT))!! + k = base64ToBase64Url(Base64.encodeToString(key, Base64.DEFAULT)) ), iv = Base64.encodeToString(initVectorBytes, Base64.DEFAULT).replace("\n", "").replace("=", ""), - hashes = mapOf("sha256" to base64ToUnpaddedBase64(Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT))!!), + hashes = mapOf("sha256" to base64ToUnpaddedBase64(Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT))), v = "v2" ), encryptedByteArray = outStream.toByteArray() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/KeysBackup.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/KeysBackup.kt index 786923dad5..47da851bdd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/KeysBackup.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/KeysBackup.kt @@ -31,6 +31,7 @@ import im.vector.matrix.android.api.listeners.StepProgressListener import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupService import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupStateListener +import im.vector.matrix.android.api.util.JsonDict import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP import im.vector.matrix.android.internal.crypto.MXOlmDevice import im.vector.matrix.android.internal.crypto.MegolmSessionData @@ -194,22 +195,23 @@ internal class KeysBackup @Inject constructor( callback: MatrixCallback) { val createKeysBackupVersionBody = CreateKeysBackupVersionBody() createKeysBackupVersionBody.algorithm = keysBackupCreationInfo.algorithm + @Suppress("UNCHECKED_CAST") createKeysBackupVersionBody.authData = MoshiProvider.providesMoshi().adapter(Map::class.java) - .fromJson(keysBackupCreationInfo.authData?.toJsonString()) as Map? + .fromJson(keysBackupCreationInfo.authData?.toJsonString() ?: "") as JsonDict? keysBackupStateManager.state = KeysBackupState.Enabling createKeysBackupVersionTask .configureWith(createKeysBackupVersionBody) { this.callback = object : MatrixCallback { - override fun onSuccess(info: KeysVersion) { + override fun onSuccess(data: KeysVersion) { // Reset backup markers. cryptoStore.resetBackupMarkers() val keyBackupVersion = KeysVersionResult() keyBackupVersion.algorithm = createKeysBackupVersionBody.algorithm keyBackupVersion.authData = createKeysBackupVersionBody.authData - keyBackupVersion.version = info.version + keyBackupVersion.version = data.version // We can consider that the server does not have keys yet keyBackupVersion.count = 0 @@ -217,7 +219,7 @@ internal class KeysBackup @Inject constructor( enableKeysBackup(keyBackupVersion) - callback.onSuccess(info) + callback.onSuccess(data) } override fun onFailure(failure: Throwable) { @@ -275,7 +277,8 @@ internal class KeysBackup @Inject constructor( val keysBackupData = cryptoStore.getKeysBackupData() val totalNumberOfKeysServer = keysBackupData?.backupLastServerNumberOfKeys ?: -1 - val hashServer = keysBackupData?.backupLastServerHash + // Not used for the moment + // val hashServer = keysBackupData?.backupLastServerHash return when { totalNumberOfKeysLocally < totalNumberOfKeysServer -> { @@ -414,7 +417,7 @@ internal class KeysBackup @Inject constructor( olmDevice.verifySignature(fingerprint, authData.signalableJSONDictionary(), mySigs[keyId] as String) isSignatureValid = true } catch (e: OlmException) { - Timber.v("getKeysBackupTrust: Bad signature from device " + device.deviceId + " " + e.localizedMessage) + Timber.v(e, "getKeysBackupTrust: Bad signature from device ${device.deviceId}") } } @@ -484,6 +487,7 @@ internal class KeysBackup @Inject constructor( val moshi = MoshiProvider.providesMoshi() val adapter = moshi.adapter(Map::class.java) + @Suppress("UNCHECKED_CAST") updateKeysBackupVersionBody.authData = adapter.fromJson(newMegolmBackupAuthData.toJsonString()) as Map? updateKeysBackupVersionBody @@ -616,7 +620,7 @@ internal class KeysBackup @Inject constructor( GlobalScope.launch(coroutineDispatchers.main) { withContext(coroutineDispatchers.crypto) { - Try { + Try { // Check if the recovery is valid before going any further if (!isValidRecoveryKeyForKeysBackupVersion(recoveryKey, keysVersionResult)) { Timber.e("restoreKeysWithRecoveryKey: Invalid recovery key for this keys version") @@ -631,7 +635,7 @@ internal class KeysBackup @Inject constructor( throw InvalidParameterException("Invalid recovery key") } - decryption!! + decryption } }.fold( { @@ -661,14 +665,12 @@ internal class KeysBackup @Inject constructor( } } } - Timber.v("restoreKeysWithRecoveryKey: Decrypted " + sessionsData.size + " keys out of " - + sessionsFromHsCount + " from the backup store on the homeserver") + Timber.v("restoreKeysWithRecoveryKey: Decrypted ${sessionsData.size} keys out of $sessionsFromHsCount from the backup store on the homeserver") // Do not trigger a backup for them if they come from the backup version we are using val backUp = keysVersionResult.version != keysBackupVersion?.version if (backUp) { - Timber.v("restoreKeysWithRecoveryKey: Those keys will be backed up to backup version: " - + keysBackupVersion?.version) + Timber.v("restoreKeysWithRecoveryKey: Those keys will be backed up to backup version: ${keysBackupVersion?.version}") } // Import them into the crypto store @@ -986,7 +988,7 @@ internal class KeysBackup @Inject constructor( val versionInStore = cryptoStore.getKeyBackupVersion() if (data.usable) { - Timber.v("checkAndStartWithKeysBackupVersion: Found usable key backup. version: " + keyBackupVersion.version) + Timber.v("checkAndStartWithKeysBackupVersion: Found usable key backup. version: ${keyBackupVersion.version}") // Check the version we used at the previous app run if (versionInStore != null && versionInStore != keyBackupVersion.version) { Timber.v(" -> clean the previously used version $versionInStore") @@ -996,7 +998,7 @@ internal class KeysBackup @Inject constructor( Timber.v(" -> enabling key backups") enableKeysBackup(keyBackupVersion) } else { - Timber.v("checkAndStartWithKeysBackupVersion: No usable key backup. version: " + keyBackupVersion.version) + Timber.v("checkAndStartWithKeysBackupVersion: No usable key backup. version: ${keyBackupVersion.version}") if (versionInStore != null) { Timber.v(" -> disabling key backup") resetKeysBackupData() @@ -1201,7 +1203,7 @@ internal class KeysBackup @Inject constructor( // Get a chunk of keys to backup val olmInboundGroupSessionWrappers = cryptoStore.inboundGroupSessionsToBackup(KEY_BACKUP_SEND_KEYS_MAX_COUNT) - Timber.v("backupKeys: 1 - " + olmInboundGroupSessionWrappers.size + " sessions to back up") + Timber.v("backupKeys: 1 - ${olmInboundGroupSessionWrappers.size} sessions to back up") if (olmInboundGroupSessionWrappers.isEmpty()) { // Backup is up to date diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/model/rest/KeysAlgorithmAndData.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/model/rest/KeysAlgorithmAndData.kt index 20e7357a39..6fba833589 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/model/rest/KeysAlgorithmAndData.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/model/rest/KeysAlgorithmAndData.kt @@ -17,6 +17,7 @@ package im.vector.matrix.android.internal.crypto.keysbackup.model.rest import com.squareup.moshi.Json +import im.vector.matrix.android.api.util.JsonDict import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupAuthData import im.vector.matrix.android.internal.di.MoshiProvider @@ -49,7 +50,7 @@ open class KeysAlgorithmAndData { * algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2" see [im.vector.matrix.android.internal.crypto.keysbackup.MegolmBackupAuthData] */ @Json(name = "auth_data") - var authData: Map? = null + var authData: JsonDict? = null /** * Facility method to convert authData to a MegolmBackupAuthData object diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/MXKey.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/MXKey.kt index 2fb545a0a9..5c2a3522e7 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/MXKey.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/MXKey.kt @@ -103,6 +103,7 @@ data class MXKey( val params = map[firstKey] if (params != null) { if (params["key"] is String) { + @Suppress("UNCHECKED_CAST") return MXKey( type = components[0], keyId = components[1], diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt index 1b19db2b89..4e8dfcb2b0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt @@ -179,7 +179,7 @@ internal interface IMXCryptoStore { * @param userId The user's id. * @param devices A map from device id to 'MXDevice' object for the device. */ - fun storeUserDevices(userId: String, devices: Map) + fun storeUserDevices(userId: String, devices: Map?) /** * Retrieve the known devices for a user. diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/Helper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/Helper.kt index 3f9aea3369..ed91859d5b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/Helper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/Helper.kt @@ -98,6 +98,7 @@ fun deserializeFromRealm(string: String?): T? { val gzis = GZIPInputStream(bais) val ois = ObjectInputStream(gzis) + @Suppress("UNCHECKED_CAST") val result = ois.readObject() as T ois.close() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt index 87e8b55b50..c18d10613f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt @@ -209,10 +209,7 @@ internal class RealmCryptoStore(private val realmConfiguration: RealmConfigurati ?.getDeviceInfo() } - override fun storeUserDevices(userId: String, devices: Map) { - if (userId == null) { - return - } + override fun storeUserDevices(userId: String, devices: Map?) { doRealmTransaction(realmConfiguration) { realm -> if (devices == null) { // Remove the user @@ -281,7 +278,7 @@ internal class RealmCryptoStore(private val realmConfiguration: RealmConfigurati try { sessionIdentifier = olmSessionWrapper.olmSession.sessionIdentifier() } catch (e: OlmException) { - Timber.e(e, "## storeSession() : sessionIdentifier failed " + e.message) + Timber.e(e, "## storeSession() : sessionIdentifier failed") } if (sessionIdentifier != null) { @@ -367,7 +364,7 @@ internal class RealmCryptoStore(private val realmConfiguration: RealmConfigurati try { sessionIdentifier = session.olmInboundGroupSession?.sessionIdentifier() } catch (e: OlmException) { - Timber.e(e, "## storeInboundGroupSession() : sessionIdentifier failed " + e.message) + Timber.e(e, "## storeInboundGroupSession() : sessionIdentifier failed") } if (sessionIdentifier != null) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventAnnotationsSummaryMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventAnnotationsSummaryMapper.kt index 1b7b7f6407..7736d51df6 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventAnnotationsSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventAnnotationsSummaryMapper.kt @@ -61,7 +61,7 @@ internal object EventAnnotationsSummaryMapper { it.lastEditTs ) } - eventAnnotationsSummaryEntity.reactionsSummary = annotationsSummary.reactionsSummary?.let { + eventAnnotationsSummaryEntity.reactionsSummary = annotationsSummary.reactionsSummary.let { RealmList().apply { addAll(it.map { ReactionAggregatedSummaryEntity( diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt index 4375a19d17..36f5642ee2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt @@ -48,16 +48,17 @@ internal object EventMapper { } fun map(eventEntity: EventEntity): Event { - val ud = if (eventEntity.unsignedData.isNullOrBlank()) { - null - } else { - try { - MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).fromJson(eventEntity.unsignedData) - } catch (t: JsonDataException) { - null - } + val ud = eventEntity.unsignedData + ?.takeIf { it.isNotBlank() } + ?.let { + try { + MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).fromJson(it) + } catch (t: JsonDataException) { + Timber.e(t, "Failed to parse UnsignedData") + null + } + } - } return Event( type = eventEntity.type, eventId = eventEntity.eventId, @@ -79,7 +80,9 @@ internal object EventMapper { } } //TODO get the full crypto error object - it.mCryptoError = eventEntity.decryptionErrorCode?.let { MXCryptoError.ErrorType.valueOf(it) } + it.mCryptoError = eventEntity.decryptionErrorCode?.let { errorCode -> + MXCryptoError.ErrorType.valueOf(errorCode) + } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/UserAgentHolder.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/UserAgentHolder.kt index 5c344a0b11..2bfeb73621 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/UserAgentHolder.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/UserAgentHolder.kt @@ -58,7 +58,7 @@ internal class UserAgentHolder @Inject constructor(private val context: Context) appName = appPackageName } } catch (e: Exception) { - Timber.e(e, "## initUserAgent() : failed " + e.message) + Timber.e(e, "## initUserAgent() : failed") } var systemUserAgent = System.getProperty("http.agent") diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/CertUtil.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/CertUtil.kt index 976cbde17d..2536d54819 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/CertUtil.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/CertUtil.kt @@ -104,11 +104,11 @@ internal object CertUtil { * Recursively checks the exception to see if it was caused by an * UnrecognizedCertificateException * - * @param e the throwable. + * @param root the throwable. * @return The UnrecognizedCertificateException if exists, else null. */ - fun getCertificateException(e: Throwable?): UnrecognizedCertificateException? { - var e = e + fun getCertificateException(root: Throwable?): UnrecognizedCertificateException? { + var e = root var i = 0 // Just in case there is a getCause loop while (e != null && i < 10) { if (e is UnrecognizedCertificateException) { @@ -140,7 +140,7 @@ internal object CertUtil { try { tf = TrustManagerFactory.getInstance("PKIX") } catch (e: Exception) { - Timber.e(e, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed " + e.message) + Timber.e(e, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed") } // it doesn't exist, use the default one. @@ -148,7 +148,7 @@ internal object CertUtil { try { tf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) } catch (e: Exception) { - Timber.e(e, "## addRule : onBingRuleUpdateFailure failed " + e.message) + Timber.e(e, "## addRule : onBingRuleUpdateFailure failed") } } @@ -202,7 +202,7 @@ internal object CertUtil { try { for (cert in session.peerCertificates) { for (allowedFingerprint in trustedFingerprints) { - if (allowedFingerprint != null && cert is X509Certificate && allowedFingerprint.matchesCert(cert)) { + if (cert is X509Certificate && allowedFingerprint.matchesCert(cert)) { return@HostnameVerifier true } } @@ -235,6 +235,7 @@ internal object CertUtil { builder.cipherSuites(*tlsCipherSuites.toTypedArray()) } + @Suppress("DEPRECATION") builder.supportsTlsExtensions(hsConfig.shouldAcceptTlsExtensions) val list = ArrayList() list.add(builder.build()) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/PinnedTrustManager.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/PinnedTrustManager.kt index 2438114aa2..f3f9ecc562 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/PinnedTrustManager.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/ssl/PinnedTrustManager.kt @@ -31,54 +31,50 @@ import javax.net.ssl.X509TrustManager * @param defaultTrustManager Optional trust manager to fall back on if cert does not match * any of the fingerprints. Can be null. */ -internal class PinnedTrustManager(private val mFingerprints: List?, - private val mDefaultTrustManager: X509TrustManager?) : X509TrustManager { +internal class PinnedTrustManager(private val fingerprints: List?, + private val defaultTrustManager: X509TrustManager?) : X509TrustManager { @Throws(CertificateException::class) override fun checkClientTrusted(chain: Array, s: String) { try { - if (mDefaultTrustManager != null) { - mDefaultTrustManager.checkClientTrusted( - chain, s - ) + if (defaultTrustManager != null) { + defaultTrustManager.checkClientTrusted(chain, s) return } } catch (e: CertificateException) { // If there is an exception we fall back to checking fingerprints - if (mFingerprints == null || mFingerprints.isEmpty()) { + if (fingerprints == null || fingerprints.isEmpty()) { throw UnrecognizedCertificateException(chain[0], Fingerprint.newSha256Fingerprint(chain[0]), e.cause) } } - checkTrusted("client", chain) + checkTrusted(chain) } @Throws(CertificateException::class) override fun checkServerTrusted(chain: Array, s: String) { try { - if (mDefaultTrustManager != null) { - mDefaultTrustManager.checkServerTrusted( - chain, s - ) + if (defaultTrustManager != null) { + defaultTrustManager.checkServerTrusted(chain, s) return } } catch (e: CertificateException) { // If there is an exception we fall back to checking fingerprints - if (mFingerprints == null || mFingerprints.isEmpty()) { + if (fingerprints == null || fingerprints.isEmpty()) { throw UnrecognizedCertificateException(chain[0], Fingerprint.newSha256Fingerprint(chain[0]), e.cause) } } - checkTrusted("server", chain) + checkTrusted(chain) } @Throws(CertificateException::class) - private fun checkTrusted(type: String, chain: Array) { + private fun checkTrusted(chain: Array) { val cert = chain[0] var found = false - if (mFingerprints != null) { - for (allowedFingerprint in mFingerprints) { + if (fingerprints != null) { + for (allowedFingerprint in fingerprints) { if (allowedFingerprint.matchesCert(cert)) { found = true break diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt index 8c554977e3..422ceca3cc 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt @@ -22,9 +22,13 @@ import im.vector.matrix.android.internal.di.Authenticated import im.vector.matrix.android.internal.network.ProgressRequestBody import im.vector.matrix.android.internal.network.awaitResponse import im.vector.matrix.android.internal.network.toFailure -import okhttp3.* import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody import java.io.File import java.io.IOException import javax.inject.Inject @@ -32,8 +36,8 @@ import javax.inject.Inject internal class FileUploader @Inject constructor(@Authenticated private val okHttpClient: OkHttpClient, - private val sessionParams: SessionParams, - private val moshi: Moshi) { + sessionParams: SessionParams, + moshi: Moshi) { private val uploadUrl = DefaultContentUrlResolver.getUploadUrl(sessionParams.homeServerConnectionConfig) private val responseAdapter = moshi.adapter(ContentUploadResponse::class.java) @@ -43,7 +47,7 @@ internal class FileUploader @Inject constructor(@Authenticated filename: String?, mimeType: String, progressListener: ProgressRequestBody.Listener? = null): ContentUploadResponse { - val uploadBody = RequestBody.create(mimeType.toMediaTypeOrNull(), file) + val uploadBody = file.asRequestBody(mimeType.toMediaTypeOrNull()) return upload(uploadBody, filename, progressListener) } @@ -52,7 +56,7 @@ internal class FileUploader @Inject constructor(@Authenticated filename: String?, mimeType: String, progressListener: ProgressRequestBody.Listener? = null): ContentUploadResponse { - val uploadBody = RequestBody.create(mimeType.toMediaTypeOrNull(), byteArray) + val uploadBody = byteArray.toRequestBody(mimeType.toMediaTypeOrNull()) return upload(uploadBody, filename, progressListener) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt index ac3c7a4e22..34e58d7ba9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt @@ -23,7 +23,6 @@ import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.query.types import im.vector.matrix.android.internal.di.SessionDatabase -import im.vector.matrix.android.internal.di.UserId import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith import io.realm.OrderedCollectionChangeSet @@ -37,7 +36,6 @@ import javax.inject.Inject * As it will actually delete the content, it should be called last in the list of listener. */ internal class EventsPruner @Inject constructor(@SessionDatabase realmConfiguration: RealmConfiguration, - @UserId private val userId: String, private val pruneEventTask: PruneEventTask, private val taskExecutor: TaskExecutor) : RealmLiveEntityObserver(realmConfiguration) { @@ -52,10 +50,7 @@ internal class EventsPruner @Inject constructor(@SessionDatabase realmConfigurat .mapNotNull { results[it]?.asDomain() } .toList() - val params = PruneEventTask.Params( - insertedDomains, - userId - ) + val params = PruneEventTask.Params(insertedDomains) pruneEventTask.configureWith(params).executeBy(taskExecutor) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventTask.kt index 35df20df78..4f7bf46984 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventTask.kt @@ -38,8 +38,7 @@ import javax.inject.Inject internal interface PruneEventTask : Task { data class Params( - val redactionEvents: List, - val userId: String + val redactionEvents: List ) } @@ -49,19 +48,19 @@ internal class DefaultPruneEventTask @Inject constructor(private val monarchy: M override suspend fun execute(params: PruneEventTask.Params) { monarchy.awaitTransaction { realm -> params.redactionEvents.forEach { event -> - pruneEvent(realm, event, params.userId) + pruneEvent(realm, event) } } } - private fun pruneEvent(realm: Realm, redactionEvent: Event, userId: String) { + private fun pruneEvent(realm: Realm, redactionEvent: Event) { if (redactionEvent.redacts.isNullOrBlank()) { return } - val redactionEventEntity = EventEntity.where(realm, eventId = redactionEvent.eventId - ?: "").findFirst() - ?: return + // Check that we know this event + EventEntity.where(realm, eventId = redactionEvent.eventId ?: "").findFirst() ?: return + val isLocalEcho = LocalEchoEventFactory.isLocalEchoId(redactionEvent.eventId ?: "") Timber.v("Redact event for ${redactionEvent.redacts} localEcho=$isLocalEcho") diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt index 031ceb1681..4146234d1f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt @@ -71,7 +71,7 @@ internal class EncryptEventWorker(context: Context, params: WorkerParameters) localEchoUpdater.updateSendState(localEvent.eventId, SendState.ENCRYPTING) - val localMutableContent = HashMap(localEvent.content) + val localMutableContent = localEvent.content?.toMutableMap() ?: mutableMapOf() params.keepKeys?.forEach { localMutableContent.remove(it) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt index 9ed2dbad97..4e9e2757d9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt @@ -160,7 +160,7 @@ internal class LocalEchoEventFactory @Inject constructor(@UserId private val use reaction ) ) - val localId = dummyEventId(roomId) + val localId = dummyEventId() return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), @@ -266,7 +266,7 @@ internal class LocalEchoEventFactory @Inject constructor(@UserId private val use } private fun createEvent(roomId: String, content: Any? = null): Event { - val localID = dummyEventId(roomId) + val localID = dummyEventId() return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), @@ -282,7 +282,7 @@ internal class LocalEchoEventFactory @Inject constructor(@UserId private val use return System.currentTimeMillis() } - private fun dummyEventId(roomId: String): String { + private fun dummyEventId(): String { return "$LOCAL_ID_PREFIX${UUID.randomUUID()}" } @@ -384,7 +384,7 @@ internal class LocalEchoEventFactory @Inject constructor(@UserId private val use } */ fun createRedactEvent(roomId: String, eventId: String, reason: String?): Event { - val localID = dummyEventId(roomId) + val localID = dummyEventId() return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), @@ -398,7 +398,7 @@ internal class LocalEchoEventFactory @Inject constructor(@UserId private val use } fun saveLocalEcho(monarchy: Monarchy, event: Event) { - if (event.roomId == null) throw IllegalStateException("Your event should have a roomId") + checkNotNull(event.roomId) { "Your event should have a roomId" } monarchy.writeAsync { realm -> val roomEntity = RoomEntity.where(realm, roomId = event.roomId).findFirst() ?: return@writeAsync diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt index 8f7d4b9905..6fa8ccbe85 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt @@ -71,7 +71,7 @@ internal class DefaultTimelineService @AssistedInject constructor(@Assisted priv return monarchy .fetchCopyMap({ TimelineEventEntity.where(it, roomId = roomId, eventId = eventId).findFirst() - }, { entity, realm -> + }, { entity, _ -> timelineEventMapper.map(entity) }) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/securestorage/SecretStoringUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/securestorage/SecretStoringUtils.kt index 6192aaf148..6d970a5e4b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/securestorage/SecretStoringUtils.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/securestorage/SecretStoringUtils.kt @@ -14,6 +14,8 @@ * limitations under the License. */ +@file:Suppress("DEPRECATION") + package im.vector.matrix.android.internal.session.securestorage import android.content.Context @@ -65,7 +67,7 @@ import javax.security.auth.x500.X500Principal * //This can be stored anywhere e.g. encoded in b64 and stored in preference for example * * //to get back the secret, just call - * val kDecripted = SecretStoringUtils.loadSecureSecret(KEncrypted!!, "myAlias", context) + * val kDecrypted = SecretStoringUtils.loadSecureSecret(KEncrypted!!, "myAlias", context) * * * You can also just use this utility to store a secret key, and use any encryption algorithm that you want. @@ -169,7 +171,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte } /* - Symetric Key Generation is only available in M, so before M the idea is to: + Symmetric Key Generation is only available in M, so before M the idea is to: - Generate a pair of RSA keys; - Generate a random AES key; - Encrypt the AES key using the RSA public key; @@ -194,7 +196,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte .setStartDate(start.time) .setEndDate(end.time) .build() - KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_KEY_STORE).run { + KeyPairGenerator.getInstance("RSA" /*KeyProperties.KEY_ALGORITHM_RSA*/, ANDROID_KEY_STORE).run { initialize(spec) generateKeyPair() } @@ -230,7 +232,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte @RequiresApi(Build.VERSION_CODES.KITKAT) private fun encryptStringK(text: String, keyAlias: String): ByteArray? { - //we generate a random symetric key + //we generate a random symmetric key val key = ByteArray(16) secureRandom.nextBytes(key) val sKey = SecretKeySpec(key, "AES") @@ -307,7 +309,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte ObjectOutputStream(bos1).use { it.writeObject(writeObject) } - //Have to do it like that if i encapsulate the outputstream, the cipher could fail saying reuse IV + //Have to do it like that if i encapsulate the output stream, the cipher could fail saying reuse IV val doFinal = cipher.doFinal(bos1.toByteArray()) output.write(FORMAT_API_M.toInt()) output.write(iv.size) @@ -317,7 +319,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte @RequiresApi(Build.VERSION_CODES.KITKAT) private fun saveSecureObjectK(keyAlias: String, output: OutputStream, writeObject: Any) { - //we generate a random symetric key + //we generate a random symmetric key val key = ByteArray(16) secureRandom.nextBytes(key) val sKey = SecretKeySpec(key, "AES") @@ -360,7 +362,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte ObjectOutputStream(bos1).use { it.writeObject(writeObject) } - //Have to do it like that if i encapsulate the outputstream, the cipher could fail saying reuse IV + //Have to do it like that if i encapsulate the output stream, the cipher could fail saying reuse IV val doFinal = cipher.doFinal(bos1.toByteArray()) output.write(FORMAT_2.toInt()) @@ -405,6 +407,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte CipherInputStream(inputStream, cipher).use { cipherInputStream -> ObjectInputStream(cipherInputStream).use { val readObject = it.readObject() + @Suppress("UNCHECKED_CAST") return readObject as? T } } @@ -428,6 +431,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte CipherInputStream(encIS, cipher).use { cipherInputStream -> ObjectInputStream(cipherInputStream).use { val readObject = it.readObject() + @Suppress("UNCHECKED_CAST") return readObject as? T } } @@ -449,8 +453,9 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte val encIS = ByteArrayInputStream(encrypted) CipherInputStream(encIS, cipher).use { - ObjectInputStream(it).use { - val readObject = it.readObject() + ObjectInputStream(it).use { ois -> + val readObject = ois.readObject() + @Suppress("UNCHECKED_CAST") return readObject as? T } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index 43d6462899..c21b1840ab 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -24,13 +24,8 @@ import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.tag.RoomTagContent -import im.vector.matrix.android.internal.session.room.read.FullyReadContent -import im.vector.matrix.android.internal.database.helper.add -import im.vector.matrix.android.internal.database.helper.addOrUpdate -import im.vector.matrix.android.internal.database.helper.addStateEvent -import im.vector.matrix.android.internal.database.helper.lastStateIndex -import im.vector.matrix.android.internal.database.helper.updateSenderDataFor import im.vector.matrix.android.internal.crypto.DefaultCryptoService +import im.vector.matrix.android.internal.database.helper.* import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.EventEntityFields import im.vector.matrix.android.internal.database.model.RoomEntity @@ -42,12 +37,9 @@ import im.vector.matrix.android.internal.session.mapWithProgress import im.vector.matrix.android.internal.session.notification.DefaultPushRuleService import im.vector.matrix.android.internal.session.notification.ProcessEventForPushTask import im.vector.matrix.android.internal.session.room.RoomSummaryUpdater +import im.vector.matrix.android.internal.session.room.read.FullyReadContent import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection -import im.vector.matrix.android.internal.session.sync.model.InvitedRoomSync -import im.vector.matrix.android.internal.session.sync.model.RoomSync -import im.vector.matrix.android.internal.session.sync.model.RoomSyncAccountData -import im.vector.matrix.android.internal.session.sync.model.RoomSyncEphemeral -import im.vector.matrix.android.internal.session.sync.model.RoomsSyncResponse +import im.vector.matrix.android.internal.session.sync.model.* import im.vector.matrix.android.internal.session.user.UserEntityFactory import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith @@ -247,11 +239,11 @@ internal class RoomSyncHandler @Inject constructor(private val monarchy: Monarch private fun handleEphemeral(realm: Realm, roomId: String, ephemeral: RoomSyncEphemeral, - isInitalSync: Boolean) { + isInitialSync: Boolean) { for (event in ephemeral.events) { if (event.type != EventType.RECEIPT) continue val readReceiptContent = event.content as? ReadReceiptContent ?: continue - readReceiptHandler.handle(realm, roomId, readReceiptContent, isInitalSync) + readReceiptHandler.handle(realm, roomId, readReceiptContent, isInitialSync) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/CompatUtil.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/CompatUtil.kt index d0a5f2f82f..e277226d1e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/CompatUtil.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/CompatUtil.kt @@ -14,6 +14,8 @@ * limitations under the License. */ +@file:Suppress("DEPRECATION") + package im.vector.matrix.android.internal.util import android.content.Context @@ -34,7 +36,7 @@ import java.security.* import java.security.cert.CertificateException import java.security.spec.AlgorithmParameterSpec import java.security.spec.RSAKeyGenParameterSpec -import java.util.Calendar +import java.util.* import java.util.zip.GZIPOutputStream import javax.crypto.* import javax.crypto.spec.GCMParameterSpec @@ -244,9 +246,6 @@ object CompatUtil { } val keyAndVersion = getAesGcmLocalProtectionKey(context) - if (keyAndVersion == null || keyAndVersion.secretKey == null) { - throw KeyStoreException() - } val cipher = Cipher.getInstance(AES_GCM_CIPHER_TYPE) val iv: ByteArray @@ -261,7 +260,7 @@ object CompatUtil { } if (iv.size != AES_GCM_IV_LENGTH) { - Timber.e(TAG, "Invalid IV length " + iv.size) + Timber.e(TAG, "Invalid IV length ${iv.size}") return null } @@ -307,16 +306,11 @@ object CompatUtil { val cipher = Cipher.getInstance(AES_GCM_CIPHER_TYPE) val keyAndVersion = getAesGcmLocalProtectionKey(context) - if (keyAndVersion == null || keyAndVersion.secretKey == null) { - throw KeyStoreException() - } - val spec: AlgorithmParameterSpec - - if (keyAndVersion.androidVersionWhenTheKeyHasBeenGenerated >= Build.VERSION_CODES.M) { - spec = GCMParameterSpec(AES_GCM_KEY_SIZE_IN_BITS, iv) + val spec: AlgorithmParameterSpec = if (keyAndVersion.androidVersionWhenTheKeyHasBeenGenerated >= Build.VERSION_CODES.M) { + GCMParameterSpec(AES_GCM_KEY_SIZE_IN_BITS, iv) } else { - spec = IvParameterSpec(iv) + IvParameterSpec(iv) } cipher.init(Cipher.DECRYPT_MODE, keyAndVersion.secretKey, spec) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt index a277498526..aa91a1ae9f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt @@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.util import im.vector.matrix.android.api.MatrixPatterns import timber.log.Timber +import java.util.* /** * Convert a string to an UTF8 String @@ -25,13 +26,13 @@ import timber.log.Timber * @param s the string to convert * @return the utf-8 string */ -fun convertToUTF8(s: String): String? { +fun convertToUTF8(s: String): String { return try { val bytes = s.toByteArray(Charsets.UTF_8) String(bytes) } catch (e: Exception) { Timber.e(e, "## convertToUTF8() failed") - null + s } } @@ -41,13 +42,13 @@ fun convertToUTF8(s: String): String? { * @param s the string to convert * @return the utf-16 string */ -fun convertFromUTF8(s: String): String? { +fun convertFromUTF8(s: String): String { return try { val bytes = s.toByteArray() String(bytes, Charsets.UTF_8) } catch (e: Exception) { Timber.e(e, "## convertFromUTF8() failed") - null + s } } @@ -55,5 +56,5 @@ fun String?.firstLetterOfDisplayName(): String { if (this.isNullOrEmpty()) return "" val isUserId = MatrixPatterns.isUserId(this) val firstLetterIndex = if (isUserId) 1 else 0 - return this[firstLetterIndex].toString().toUpperCase() + return this[firstLetterIndex].toString().toUpperCase(Locale.ROOT) } \ No newline at end of file