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.QuadFlask", "colorpicker")
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("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.android.material:material:1.8.0-alpha01")
implementation("androidx.constraintlayout:constraintlayout:2.1.2")

@ -21,12 +21,14 @@ import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import at.bitfire.dav4jvm.exception.HttpException
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import com.google.android.material.composethemeadapter.MdcTheme
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskDeleter
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase
@ -57,6 +59,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
@Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var inventory: Inventory
@Inject lateinit var firebase: Firebase
@Inject lateinit var cookiePersistor: CookiePersistor
protected var caldavAccount: CaldavAccount? = null
protected lateinit var binding: ActivityCaldavAccountSettingsBinding
@ -347,6 +350,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
}
protected open suspend fun removeAccount() {
cookiePersistor.clearSession(caldavAccount?.url)
taskDeleter.delete(caldavAccount!!)
setResult(Activity.RESULT_OK)
finish()
@ -379,5 +383,10 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
const val EXTRA_CALDAV_DATA = "caldavData" // $NON-NLS-1$
const val EXTRA_SERVER_TYPE = "serverType"
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 at.bitfire.cert4android.CustomCertManager
import at.bitfire.dav4jvm.BasicDigestAuthHandler
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.CookieJar
import okhttp3.OkHttpClient
import okhttp3.internal.tls.OkHostnameVerifier
import org.tasks.DebugNetworkInterceptor
import org.tasks.caldav.TasksCookieJar
import org.tasks.preferences.Preferences
import org.tasks.security.KeyStoreEncryption
import javax.inject.Inject
import javax.net.ssl.SSLContext
class HttpClientFactory @Inject constructor(
@ApplicationContext private val context: Context,
private val preferences: Preferences,
private val interceptor: DebugNetworkInterceptor,
private val encryption: KeyStoreEncryption,
private val cookieJar: CookieJar,
@ApplicationContext private val context: Context,
private val preferences: Preferences,
private val interceptor: DebugNetworkInterceptor,
private val encryption: KeyStoreEncryption,
private val cookiePersistor: CookiePersistor,
) {
suspend fun newClient(
foreground: Boolean = false,
@ -55,7 +56,7 @@ class HttpClientFactory @Inject constructor(
.sslSocketFactory(sslContext.socketFactory, customCertManager)
.hostnameVerifier(hostnameVerifier)
.addInterceptor(UserAgentInterceptor)
.cookieJar(cookieJar)
.cookieJar(TasksCookieJar(persistor = cookiePersistor))
block(builder)

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

@ -361,6 +361,8 @@
+| | +--- 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: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.android.material:material:1.8.0-alpha01 (*)
++--- 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-common: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.android.material:material:1.8.0-alpha01 (*)
++--- androidx.constraintlayout:constraintlayout:2.1.2 (*)

Loading…
Cancel
Save