Preserve cookies

pull/1991/head
Alex Baker 2 years ago
parent 0ae473e27f
commit f8c5fa47b3

@ -24,6 +24,7 @@ repositories {
includeModule("com.github.tasks.opentasks", "opentasks-provider") includeModule("com.github.tasks.opentasks", "opentasks-provider")
includeModule("com.github.QuadFlask", "colorpicker") includeModule("com.github.QuadFlask", "colorpicker")
includeModule("com.github.twofortyfouram", "android-plugin-api-for-locale") includeModule("com.github.twofortyfouram", "android-plugin-api-for-locale")
includeModule("com.github.franmontiel", "PersistentCookieJar")
} }
} }
} }
@ -200,6 +201,7 @@ dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}")
implementation("com.squareup.okhttp3:okhttp:${Versions.okhttp}") implementation("com.squareup.okhttp3:okhttp:${Versions.okhttp}")
implementation("com.github.franmontiel:PersistentCookieJar:v1.0.1")
implementation("com.google.code.gson:gson:2.8.8") implementation("com.google.code.gson:gson:2.8.8")
implementation("com.google.android.material:material:1.8.0-alpha01") implementation("com.google.android.material:material:1.8.0-alpha01")
implementation("androidx.constraintlayout:constraintlayout:2.1.2") implementation("androidx.constraintlayout:constraintlayout:2.1.2")

@ -21,12 +21,14 @@ import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.exception.HttpException
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import com.google.android.material.composethemeadapter.MdcTheme import com.google.android.material.composethemeadapter.MdcTheme
import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskDeleter import com.todoroo.astrid.service.TaskDeleter
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
@ -57,6 +59,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
@Inject lateinit var taskDeleter: TaskDeleter @Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var inventory: Inventory @Inject lateinit var inventory: Inventory
@Inject lateinit var firebase: Firebase @Inject lateinit var firebase: Firebase
@Inject lateinit var cookiePersistor: CookiePersistor
protected var caldavAccount: CaldavAccount? = null protected var caldavAccount: CaldavAccount? = null
protected lateinit var binding: ActivityCaldavAccountSettingsBinding protected lateinit var binding: ActivityCaldavAccountSettingsBinding
@ -347,6 +350,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
} }
protected open suspend fun removeAccount() { protected open suspend fun removeAccount() {
cookiePersistor.clearSession(caldavAccount?.url)
taskDeleter.delete(caldavAccount!!) taskDeleter.delete(caldavAccount!!)
setResult(Activity.RESULT_OK) setResult(Activity.RESULT_OK)
finish() finish()
@ -379,5 +383,10 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
const val EXTRA_CALDAV_DATA = "caldavData" // $NON-NLS-1$ const val EXTRA_CALDAV_DATA = "caldavData" // $NON-NLS-1$
const val EXTRA_SERVER_TYPE = "serverType" const val EXTRA_SERVER_TYPE = "serverType"
const val PASSWORD_MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" const val PASSWORD_MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"
fun CookiePersistor.clearSession(url: String?) {
val httpUrl = url?.toHttpUrlOrNull() ?: return
removeAll(loadAll().filter { it.matches(httpUrl) })
}
} }
} }

@ -0,0 +1,19 @@
package org.tasks.caldav
import com.franmontiel.persistentcookiejar.PersistentCookieJar
import com.franmontiel.persistentcookiejar.cache.CookieCache
import com.franmontiel.persistentcookiejar.cache.SetCookieCache
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import okhttp3.Cookie
import okhttp3.HttpUrl
class TasksCookieJar(
private val cache: CookieCache = SetCookieCache(),
private val persistor: CookiePersistor
) : PersistentCookieJar(cache, persistor) {
@Synchronized
override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
cache.addAll(cookies)
persistor.saveAll(cookies)
}
}

@ -3,24 +3,25 @@ package org.tasks.http
import android.content.Context import android.content.Context
import at.bitfire.cert4android.CustomCertManager import at.bitfire.cert4android.CustomCertManager
import at.bitfire.dav4jvm.BasicDigestAuthHandler import at.bitfire.dav4jvm.BasicDigestAuthHandler
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okhttp3.CookieJar
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.internal.tls.OkHostnameVerifier import okhttp3.internal.tls.OkHostnameVerifier
import org.tasks.DebugNetworkInterceptor import org.tasks.DebugNetworkInterceptor
import org.tasks.caldav.TasksCookieJar
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.security.KeyStoreEncryption import org.tasks.security.KeyStoreEncryption
import javax.inject.Inject import javax.inject.Inject
import javax.net.ssl.SSLContext import javax.net.ssl.SSLContext
class HttpClientFactory @Inject constructor( class HttpClientFactory @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val preferences: Preferences, private val preferences: Preferences,
private val interceptor: DebugNetworkInterceptor, private val interceptor: DebugNetworkInterceptor,
private val encryption: KeyStoreEncryption, private val encryption: KeyStoreEncryption,
private val cookieJar: CookieJar, private val cookiePersistor: CookiePersistor,
) { ) {
suspend fun newClient( suspend fun newClient(
foreground: Boolean = false, foreground: Boolean = false,
@ -55,7 +56,7 @@ class HttpClientFactory @Inject constructor(
.sslSocketFactory(sslContext.socketFactory, customCertManager) .sslSocketFactory(sslContext.socketFactory, customCertManager)
.hostnameVerifier(hostnameVerifier) .hostnameVerifier(hostnameVerifier)
.addInterceptor(UserAgentInterceptor) .addInterceptor(UserAgentInterceptor)
.cookieJar(cookieJar) .cookieJar(TasksCookieJar(persistor = cookiePersistor))
block(builder) block(builder)

@ -3,6 +3,8 @@ package org.tasks.injection
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor
import com.todoroo.astrid.dao.Database import com.todoroo.astrid.dao.Database
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
@ -12,12 +14,10 @@ import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import okhttp3.CookieJar
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.BillingClient import org.tasks.billing.BillingClient
import org.tasks.billing.BillingClientImpl import org.tasks.billing.BillingClientImpl
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.caldav.MemoryCookieStore
import org.tasks.data.* import org.tasks.data.*
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.notifications.NotificationDao import org.tasks.notifications.NotificationDao
@ -125,6 +125,6 @@ class ApplicationModule {
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
@Provides @Provides
@Singleton fun cookiePersistor(@ApplicationContext context: Context): CookiePersistor =
fun cookieJar(): CookieJar = MemoryCookieStore() SharedPrefsCookiePersistor(context)
} }

@ -361,6 +361,8 @@
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.10 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.10 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.10 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.10 (*)
++--- com.github.franmontiel:PersistentCookieJar:v1.0.1
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.10.0 (*)
++--- com.google.code.gson:gson:2.8.8 ++--- com.google.code.gson:gson:2.8.8
++--- com.google.android.material:material:1.8.0-alpha01 (*) ++--- com.google.android.material:material:1.8.0-alpha01 (*)
++--- androidx.constraintlayout:constraintlayout:2.1.2 (*) ++--- androidx.constraintlayout:constraintlayout:2.1.2 (*)

@ -497,6 +497,8 @@
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.10 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.10 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.10 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.10 (*)
++--- com.github.franmontiel:PersistentCookieJar:v1.0.1
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.10.0 (*)
++--- com.google.code.gson:gson:2.8.8 ++--- com.google.code.gson:gson:2.8.8
++--- com.google.android.material:material:1.8.0-alpha01 (*) ++--- com.google.android.material:material:1.8.0-alpha01 (*)
++--- androidx.constraintlayout:constraintlayout:2.1.2 (*) ++--- androidx.constraintlayout:constraintlayout:2.1.2 (*)

Loading…
Cancel
Save