Move to content scanner matrix SDK to FOSS

This commit is contained in:
yostyle 2021-11-02 08:47:08 +01:00
parent 80a42d0a55
commit 0ad66446e7
22 changed files with 94 additions and 174 deletions

View file

@ -1,112 +0,0 @@
/*
* Copyright 2020 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.matrix.android.sdk.internal.session.content
import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toJson
import org.matrix.android.sdk.api.MatrixUrls
import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.network.NetworkConstants
import org.matrix.android.sdk.internal.util.ensureTrailingSlash
import javax.inject.Inject
internal class ElementContentUrlResolver @Inject constructor(
homeServerConnectionConfig: HomeServerConnectionConfig,
private val scannerService: ContentScannerService
) : ContentUrlResolver {
private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash()
override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? {
return if (scannerService.isScannerEnabled() && elementToDecrypt != null) {
val baseUrl = scannerService.getContentScannerServer()
val sep = if (baseUrl?.endsWith("/") == true) "" else "/"
val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted"
ContentUrlResolver.ResolvedMethod.POST(
url = url,
jsonBody = ScanEncryptorUtils
.getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt)
.toJson()
)
} else {
resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) }
}
}
override fun resolveFullSize(contentUrl: String?): String? {
return contentUrl
// do not allow non-mxc content URLs
?.takeIf { it.isMxcUrl() }
?.let {
resolve(
contentUrl = it,
toThumbnail = false
)
}
}
override fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ContentUrlResolver.ThumbnailMethod): String? {
return contentUrl
// do not allow non-mxc content URLs
?.takeIf { it.isMxcUrl() }
?.let {
resolve(
contentUrl = it,
toThumbnail = true,
params = "?width=$width&height=$height&method=${method.value}"
)
}
}
private fun resolve(contentUrl: String,
toThumbnail: Boolean,
params: String = ""): String? {
var serverAndMediaId = contentUrl.removePrefix(MatrixUrls.MATRIX_CONTENT_URI_SCHEME)
val apiPath = if (scannerService.isScannerEnabled()) {
NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE
} else {
NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0
}
val prefix = if (toThumbnail) {
apiPath + "thumbnail/"
} else {
apiPath + "download/"
}
val fragmentOffset = serverAndMediaId.indexOf("#")
var fragment = ""
if (fragmentOffset >= 0) {
fragment = serverAndMediaId.substring(fragmentOffset)
serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset)
}
val resolvedUrl = if (scannerService.isScannerEnabled()) {
scannerService.getContentScannerServer()!!.ensureTrailingSlash()
} else {
baseUrl
}
return resolvedUrl + prefix + serverAndMediaId + params + fragment
}
}

View file

@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session
import dagger.BindsInstance
import dagger.Component
import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule
import org.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.session.Session

View file

@ -23,6 +23,8 @@ import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.network.NetworkConstants
import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import org.matrix.android.sdk.internal.session.contentscanning.model.toJson
import org.matrix.android.sdk.internal.util.ensureTrailingSlash
import javax.inject.Inject
@ -35,6 +37,24 @@ internal class DefaultContentUrlResolver @Inject constructor(
override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? {
return if (scannerService.isScannerEnabled() && elementToDecrypt != null) {
val baseUrl = scannerService.getContentScannerServer()
val sep = if (baseUrl?.endsWith("/") == true) "" else "/"
val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted"
ContentUrlResolver.ResolvedMethod.POST(
url = url,
jsonBody = ScanEncryptorUtils
.getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt)
.toJson()
)
} else {
resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) }
}
}
override fun resolveFullSize(contentUrl: String?): String? {
return contentUrl
// do not allow non-mxc content URLs
@ -42,7 +62,7 @@ internal class DefaultContentUrlResolver @Inject constructor(
?.let {
resolve(
contentUrl = it,
prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "download/"
toThumbnail = false
)
}
}
@ -54,20 +74,27 @@ internal class DefaultContentUrlResolver @Inject constructor(
?.let {
resolve(
contentUrl = it,
prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "thumbnail/",
toThumbnail = true,
params = "?width=$width&height=$height&method=${method.value}"
)
}
}
override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? {
return resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) }
}
private fun resolve(contentUrl: String,
prefix: String,
toThumbnail: Boolean,
params: String = ""): String? {
var serverAndMediaId = contentUrl.removePrefix(MatrixUrls.MATRIX_CONTENT_URI_SCHEME)
val apiPath = if (scannerService.isScannerEnabled()) {
NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE
} else {
NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0
}
val prefix = if (toThumbnail) {
apiPath + "thumbnail/"
} else {
apiPath + "download/"
}
val fragmentOffset = serverAndMediaId.indexOf("#")
var fragment = ""
if (fragmentOffset >= 0) {
@ -75,6 +102,11 @@ internal class DefaultContentUrlResolver @Inject constructor(
serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset)
}
return baseUrl + prefix + serverAndMediaId + params + fragment
val resolvedUrl = if (scannerService.isScannerEnabled()) {
scannerService.getContentScannerServer()!!.ensureTrailingSlash()
} else {
baseUrl
}
return resolvedUrl + prefix + serverAndMediaId + params + fragment
}
}

View file

@ -4,13 +4,13 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning
package org.matrix.android.sdk.internal.session.contentscanning
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse
import okhttp3.ResponseBody
import org.matrix.android.sdk.internal.network.NetworkConstants
import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody
import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import org.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

View file

@ -4,22 +4,11 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning
package org.matrix.android.sdk.internal.session.contentscanning
import dagger.Binds
import dagger.Module
import dagger.Provides
import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import im.vector.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule
import im.vector.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask
import io.realm.RealmConfiguration
import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService
import org.matrix.android.sdk.internal.database.RealmKeysUtils
@ -28,6 +17,17 @@ import org.matrix.android.sdk.internal.di.SessionFilesDirectory
import org.matrix.android.sdk.internal.di.UserMd5
import org.matrix.android.sdk.internal.session.SessionModule
import org.matrix.android.sdk.internal.session.SessionScope
import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule
import org.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore
import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask
import java.io.File
@Module

View file

@ -4,9 +4,10 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning
package org.matrix.android.sdk.internal.session.contentscanning
import org.matrix.android.sdk.internal.session.SessionScope
import org.matrix.android.sdk.internal.session.contentscanning.ContentScanApi
import javax.inject.Inject
@SessionScope

View file

@ -4,17 +4,14 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning
package org.matrix.android.sdk.internal.session.contentscanning
import androidx.lifecycle.LiveData
import dagger.Lazy
import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask
import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.NoOpMatrixCallback
import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService
import org.matrix.android.sdk.api.session.contentscanning.ScanState
@ -24,9 +21,12 @@ import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.di.Unauthenticated
import org.matrix.android.sdk.internal.network.RetrofitFactory
import org.matrix.android.sdk.internal.session.SessionScope
import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask
import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask
import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.launchToCallback
import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers
import org.matrix.android.sdk.internal.util.awaitCallback
import timber.log.Timber
import javax.inject.Inject

View file

@ -4,15 +4,15 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning
package org.matrix.android.sdk.internal.session.contentscanning
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileKey
import org.matrix.android.sdk.internal.crypto.tools.withOlmEncryption
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson
import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody
import org.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody
import org.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson
object ScanEncryptorUtils {

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.data
package org.matrix.android.sdk.internal.session.contentscanning.data
import androidx.lifecycle.LiveData
import org.matrix.android.sdk.api.session.contentscanning.ScanState

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.db
package org.matrix.android.sdk.internal.session.contentscanning.db
import io.realm.RealmObject
import io.realm.annotations.Index

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.db
package org.matrix.android.sdk.internal.session.contentscanning.db
import io.realm.Realm
import io.realm.kotlin.createObject

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.db
package org.matrix.android.sdk.internal.session.contentscanning.db
import io.realm.RealmObject

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.db
package org.matrix.android.sdk.internal.session.contentscanning.db
import io.realm.annotations.RealmModule

View file

@ -4,12 +4,12 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.db
package org.matrix.android.sdk.internal.session.contentscanning.db
import androidx.lifecycle.LiveData
import androidx.lifecycle.Transformations
import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.api.session.contentscanning.ScanState
import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo
import io.realm.Realm

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.model
package org.matrix.android.sdk.internal.session.contentscanning.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.model
package org.matrix.android.sdk.internal.session.contentscanning.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

View file

@ -4,7 +4,7 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.model
package org.matrix.android.sdk.internal.session.contentscanning.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

View file

@ -4,13 +4,13 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks
package org.matrix.android.sdk.internal.session.contentscanning.tasks
import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import okhttp3.ResponseBody
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import org.matrix.android.sdk.internal.task.Task
import javax.inject.Inject

View file

@ -4,13 +4,12 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks
package org.matrix.android.sdk.internal.session.contentscanning.tasks
import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanApi
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.session.contentscanning.ContentScanApi
import org.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse
import org.matrix.android.sdk.internal.task.Task
import javax.inject.Inject
internal interface GetServerPublicKeyTask : Task<GetServerPublicKeyTask.Params, String?> {

View file

@ -4,16 +4,16 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks
package org.matrix.android.sdk.internal.session.contentscanning.tasks
import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import org.matrix.android.sdk.api.failure.toScanFailure
import org.matrix.android.sdk.api.session.contentscanning.ScanState
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils
import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import org.matrix.android.sdk.internal.task.Task
import javax.inject.Inject

View file

@ -4,14 +4,14 @@
* Proprietary and confidential
*/
package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks
package org.matrix.android.sdk.internal.session.contentscanning.tasks
import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import org.matrix.android.sdk.api.failure.toScanFailure
import org.matrix.android.sdk.api.session.contentscanning.ScanState
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider
import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore
import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse
import org.matrix.android.sdk.internal.task.Task
import javax.inject.Inject