element-hq / element-android

A Matrix collaboration client for Android.
https://element.io/
GNU Affero General Public License v3.0
3.35k stars 711 forks source link

If doKeyDownloadForUsers() fails, we don't encrypt for the right devices? #692

Open ara4n opened 4 years ago

ara4n commented 4 years ago

Trying to debug a situation where RiotX was failing to send decryptable messages to Riot/Web (https://github.com/matrix-org/riot-web-rageshakes/issues/1943), my best guess is that the following exceptions stopped RiotX calculating the current device list for a given room, and so failed to encrypt to the right targets:

11-19 11:27:23.964Z NetworkConnection(ioException=com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:41)
    at im.vector.matrix.android.internal.network.Request$execute$1.invokeSuspend(Unknown Source:11)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
    at com.squareup.moshi.JsonReader.syntaxError(JsonReader.java:233)
    at com.squareup.moshi.JsonUtf8Reader.checkLenient(JsonUtf8Reader.java:1051)
    at com.squareup.moshi.JsonUtf8Reader.doPeek(JsonUtf8Reader.java:366)
    at com.squareup.moshi.JsonUtf8Reader.peek(JsonUtf8Reader.java:193)
    at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:134)
    at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:41)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:96)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:76)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:37)
    ... 7 more

11-19 11:27:23.964Z 2408 E/ /DeviceListManager: ##doKeyDownloadForUsers(): error
NetworkConnection(ioException=com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:41)
    at im.vector.matrix.android.internal.network.Request$execute$1.invokeSuspend(Unknown Source:11)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
    at com.squareup.moshi.JsonReader.syntaxError(JsonReader.java:233)
    at com.squareup.moshi.JsonUtf8Reader.checkLenient(JsonUtf8Reader.java:1051)
    at com.squareup.moshi.JsonUtf8Reader.doPeek(JsonUtf8Reader.java:366)
    at com.squareup.moshi.JsonUtf8Reader.peek(JsonUtf8Reader.java:193)
    at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:134)
    at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:41)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:96)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:76)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:37)
    ... 7 more

11-19 11:27:23.987Z NetworkConnection(ioException=com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:41)
    at im.vector.matrix.android.internal.network.Request$execute$1.invokeSuspend(Unknown Source:11)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
    at com.squareup.moshi.JsonReader.syntaxError(JsonReader.java:233)
    at com.squareup.moshi.JsonUtf8Reader.checkLenient(JsonUtf8Reader.java:1051)
    at com.squareup.moshi.JsonUtf8Reader.doPeek(JsonUtf8Reader.java:366)
    at com.squareup.moshi.JsonUtf8Reader.peek(JsonUtf8Reader.java:193)
    at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:134)
    at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:41)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:96)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:76)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:37)
    ... 7 more

11-19 11:27:23.989Z 2408 E/ /DeviceListManager: ## refreshOutdatedDeviceLists() : ERROR updating device keys for users [@andrewm:amorgan.xyz, @matthew:matrix.org, @jryans:matrix.org, @valere35:matrix.org]
NetworkConnection(ioException=com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:41)
    at im.vector.matrix.android.internal.network.Request$execute$1.invokeSuspend(Unknown Source:11)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
    at com.squareup.moshi.JsonReader.syntaxError(JsonReader.java:233)
    at com.squareup.moshi.JsonUtf8Reader.checkLenient(JsonUtf8Reader.java:1051)
    at com.squareup.moshi.JsonUtf8Reader.doPeek(JsonUtf8Reader.java:366)
    at com.squareup.moshi.JsonUtf8Reader.peek(JsonUtf8Reader.java:193)
    at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:134)
    at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:41)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:96)
    at im.vector.matrix.android.internal.network.RetrofitExtensionsKt.toFailure(RetrofitExtensions.kt:76)
    at im.vector.matrix.android.internal.network.Request.execute(Request.kt:37)
    ... 7 more

Separately, the lack of logging here makes it almost impossible to see what's gone wrong - we should be logging the results of trying to keep our device lists accurate, so we can see when/how it fails.

BillCarsonFr commented 4 years ago

the lab setting 'extended log' is by default to NO, should be YES (at least for debug builds)

bmarty commented 3 years ago

Having a quick look in the code, if doKeyDownloadForUsers() fails, no message will be sent, and it will be retried later.