DownloadWorker: Download files using proxy when exists

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-03-07 00:16:16 +05:30
parent 717cb29a04
commit 2a41baf69d

View File

@@ -22,6 +22,7 @@ import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.store.data.installer.AppInstaller import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.model.DownloadInfo import com.aurora.store.data.model.DownloadInfo
import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.model.DownloadStatus
import com.aurora.store.data.model.ProxyInfo
import com.aurora.store.data.model.Request import com.aurora.store.data.model.Request
import com.aurora.store.data.network.HttpClient import com.aurora.store.data.network.HttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
@@ -31,21 +32,30 @@ import com.aurora.store.util.CertUtil
import com.aurora.store.util.DownloadWorkerUtil import com.aurora.store.util.DownloadWorkerUtil
import com.aurora.store.util.NotificationUtil import com.aurora.store.util.NotificationUtil
import com.aurora.store.util.PathUtil import com.aurora.store.util.PathUtil
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_ENABLED
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_INFO
import com.google.gson.Gson import com.google.gson.Gson
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.net.Authenticator
import java.net.InetSocketAddress
import java.net.PasswordAuthentication
import java.net.Proxy
import java.net.URL import java.net.URL
import java.security.DigestInputStream import java.security.DigestInputStream
import java.security.MessageDigest import java.security.MessageDigest
import kotlinx.coroutines.NonCancellable import javax.net.ssl.HttpsURLConnection
import kotlin.properties.Delegates import kotlin.properties.Delegates
import com.aurora.gplayapi.data.models.File as GPlayFile import com.aurora.gplayapi.data.models.File as GPlayFile
@HiltWorker @HiltWorker
class DownloadWorker @AssistedInject constructor( class DownloadWorker @AssistedInject constructor(
private val downloadDao: DownloadDao, private val downloadDao: DownloadDao,
@@ -60,6 +70,8 @@ class DownloadWorker @AssistedInject constructor(
private lateinit var icon: Bitmap private lateinit var icon: Bitmap
private lateinit var purchaseHelper: PurchaseHelper private lateinit var purchaseHelper: PurchaseHelper
private val proxy: Proxy? = getProxy()
private val NOTIFICATION_ID = 200 private val NOTIFICATION_ID = 200
private var downloading = false private var downloading = false
@@ -236,11 +248,18 @@ class DownloadWorker @AssistedInject constructor(
} }
try { try {
requestFile.createNewFile()
val algorithm = if (request.sha256.isBlank()) "SHA-1" else "SHA-256" val algorithm = if (request.sha256.isBlank()) "SHA-1" else "SHA-256"
val messageDigest = MessageDigest.getInstance(algorithm) val messageDigest = MessageDigest.getInstance(algorithm)
requestFile.createNewFile() val inputStream = if (proxy != null) {
DigestInputStream(URL(request.url).openStream(), messageDigest).use { input -> (URL(request.url).openConnection(proxy) as HttpsURLConnection).inputStream
} else {
URL(request.url).openStream()
}
DigestInputStream(inputStream, messageDigest).use { input ->
requestFile.outputStream().use { requestFile.outputStream().use {
input.copyTo(it, request.size).collectLatest { p -> onProgress(p) } input.copyTo(it, request.size).collectLatest { p -> onProgress(p) }
} }
@@ -350,4 +369,33 @@ class DownloadWorker @AssistedInject constructor(
} }
} }
} }
private fun getProxy(): Proxy? {
val proxyEnabled = Preferences.getBoolean(appContext, PREFERENCE_PROXY_ENABLED)
val proxyInfoString = Preferences.getString(appContext, PREFERENCE_PROXY_INFO)
if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") {
val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java)
val proxy = Proxy(
if (proxyInfo.protocol == "SOCKS") Proxy.Type.SOCKS else Proxy.Type.HTTP,
InetSocketAddress.createUnresolved(proxyInfo.host, proxyInfo.port)
)
val proxyUser = proxyInfo.proxyUser
val proxyPassword = proxyInfo.proxyPassword
if (!proxyUser.isNullOrBlank() && !proxyPassword.isNullOrBlank()) {
Authenticator.setDefault(object : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(proxyUser, proxyPassword.toCharArray())
}
})
}
return proxy
} else {
Log.i(TAG,"Proxy is disabled")
return null
}
}
} }