diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index c842e769..59db1ab2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -28,9 +28,6 @@ import com.hypertrack.hyperlog.HyperLog import com.mikepenz.iconics.Iconics import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont import im.wangchao.mhttp.MHttp -import im.wangchao.mhttp.internal.cookie.PersistentCookieJar -import im.wangchao.mhttp.internal.cookie.cache.SetCookieCache -import im.wangchao.mhttp.internal.cookie.persistence.SharedPrefsCookiePersistor import kotlinx.coroutines.* import me.leolin.shortcutbadger.ShortcutBadger import okhttp3.OkHttpClient @@ -41,6 +38,7 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.entity.Profile import pl.szczodrzynski.edziennik.network.NetworkUtils +import pl.szczodrzynski.edziennik.network.cookie.DumbCookieJar import pl.szczodrzynski.edziennik.sync.SyncWorker import pl.szczodrzynski.edziennik.sync.UpdateWorker import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity @@ -125,7 +123,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { .followSslRedirects(false) .build() } - val cookieJar by lazy { PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(this)) } + val cookieJar by lazy { DumbCookieJar(this) } /* _____ _ _ / ____(_) | | diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt index e893dbfc..f5adfc5d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt @@ -7,7 +7,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik import pl.szczodrzynski.edziennik.data.api.models.ApiError @@ -43,8 +42,8 @@ open class EdudziennikWeb(open val data: DataEdudziennik, open val lastSync: Lon if (semester == null && url.contains("start")) { profile?.also { profile -> - val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com") - val semesterCookie = cookies.firstOrNull { it.name() == "semester" }?.value()?.toIntOrNull() + val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com") + val semesterCookie = cookies["semester"]?.toIntOrNull() semesterCookie?.let { data.currentSemester = it } @@ -75,13 +74,7 @@ open class EdudziennikWeb(open val data: DataEdudziennik, open val lastSync: Lon } } - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("sessionid") - .value(data.webSessionId!!) - .domain("dziennikel.appspot.com") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("dziennikel.appspot.com", "sessionid", data.webSessionId) Request.builder() .url(url) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt index 8387a775..6b1615a2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt @@ -24,7 +24,7 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit) onSuccess() } else { - data.app.cookieJar.clearForDomain("dziennikel.appspot.com") + data.app.cookieJar.clear("dziennikel.appspot.com") if (data.loginEmail.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) { loginWithCredentials() } @@ -59,8 +59,8 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit) } } - val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com") - val sessionId = cookies.firstOrNull { it.name() == "sessionid" }?.value() + val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com") + val sessionId = cookies["sessionid"] if (sessionId == null) { data.error(ApiError(TAG, ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt index 5b5b11ab..3e974539 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt @@ -5,7 +5,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik import androidx.core.util.set -import okhttp3.Cookie import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_API import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_WEB @@ -24,18 +23,8 @@ class DataIdziennik(app: App, profile: Profile?, loginStore: LoginStore) : Data( loginMethods.clear() if (isWebLoginValid()) { loginMethods += LOGIN_METHOD_IDZIENNIK_WEB - app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("ASP.NET_SessionId_iDziennik") - .value(webSessionId!!) - .domain("iuczniowie.progman.pl") - .secure().httpOnly().build(), - Cookie.Builder() - .name(".ASPXAUTH") - .value(webAuth!!) - .domain("iuczniowie.progman.pl") - .secure().httpOnly().build() - )) + app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", webSessionId) + app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", webAuth) } if (isApiLoginValid()) loginMethods += LOGIN_METHOD_IDZIENNIK_API diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt index 1a9f6bc2..e15f9410 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt @@ -7,7 +7,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik @@ -24,22 +23,12 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) { init { run { if (data.isWebLoginValid()) { - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("ASP.NET_SessionId_iDziennik") - .value(data.webSessionId!!) - .domain("iuczniowie.progman.pl") - .secure().httpOnly().build(), - Cookie.Builder() - .name(".ASPXAUTH") - .value(data.webAuth!!) - .domain("iuczniowie.progman.pl") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", data.webSessionId) + data.app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", data.webAuth) onSuccess() } else { - data.app.cookieJar.clearForDomain("iuczniowie.progman.pl") + data.app.cookieJar.clear("iuczniowie.progman.pl") if (data.webSchoolName != null && data.webUsername != null && data.webPassword != null) { loginWithCredentials() } @@ -62,11 +51,11 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) { // login succeeded: there is a start page if (text.contains("czyWyswietlicDostepMobilny")) { - val cookies = data.app.cookieJar.getForDomain("iuczniowie.progman.pl") + val cookies = data.app.cookieJar.getAll("iuczniowie.progman.pl") run { - data.webSessionId = cookies.singleOrNull { it.name() == "ASP.NET_SessionId_iDziennik" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION - data.webAuth = cookies.singleOrNull { it.name() == ".ASPXAUTH" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH - data.apiBearer = cookies.singleOrNull { it.name() == "Bearer" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_BEARER + data.webSessionId = cookies["ASP.NET_SessionId_iDziennik"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION + data.webAuth = cookies[".ASPXAUTH"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH + data.apiBearer = cookies["Bearer"]?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_BEARER data.loginExpiryTime = response.getUnixDate() + 30 * MINUTE /* after about 40 minutes the login didn't work already */ data.apiExpiryTime = response.getUnixDate() + 12 * HOUR /* actually it expires after 24 hours but I'm not sure when does the token refresh. */ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt index c43172f2..80a85a9f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt @@ -4,7 +4,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.librus -import okhttp3.Cookie import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_API @@ -31,23 +30,11 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app loginMethods += LOGIN_METHOD_LIBRUS_API if (isSynergiaLoginValid()) { loginMethods += LOGIN_METHOD_LIBRUS_SYNERGIA - app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(synergiaSessionId!!) - .domain("synergia.librus.pl") - .secure().httpOnly().build() - )) + app.cookieJar.set("synergia.librus.pl", "DZIENNIKSID", synergiaSessionId) } if (isMessagesLoginValid()) { loginMethods += LOGIN_METHOD_LIBRUS_MESSAGES - app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(messagesSessionId!!) - .domain("wiadomosci.librus.pl") - .secure().httpOnly().build() - )) + app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", messagesSessionId) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt index aaff8648..bccaa1f9 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt @@ -12,7 +12,6 @@ import im.wangchao.mhttp.body.MediaTypeUtils import im.wangchao.mhttp.callback.FileCallbackHandler import im.wangchao.mhttp.callback.JsonCallbackHandler import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import org.json.JSONObject import org.json.XML import org.jsoup.Jsoup @@ -89,14 +88,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) { } } - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(data.messagesSessionId!!) - .domain("wiadomosci.librus.pl") - .secure().httpOnly().build() - )) - + data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId) val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() val doc = docBuilder.newDocument() @@ -180,14 +172,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) { } } - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(data.messagesSessionId!!) - .domain("wiadomosci.librus.pl") - .secure().httpOnly().build() - )) - + data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId) val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() val doc = docBuilder.newDocument() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt index 5486d168..5a52cd69 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt @@ -4,15 +4,12 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api -import pl.szczodrzynski.edziennik.DAY +import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LUCKY_NUMBER import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.getInt -import pl.szczodrzynski.edziennik.getJsonObject -import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Time @@ -41,9 +38,10 @@ class LibrusApiLuckyNumber(override val data: DataLibrus, luckyNumber ) - //if (luckyNumberDate > Date.getToday()) { + if (luckyNumberDate >= Date.getToday()) nextSync = luckyNumberDate.combineWith(Time(15, 0, 0)) - //} + else + nextSync = System.currentTimeMillis() + 6*HOUR*1000 data.luckyNumberList.add(luckyNumberObject) data.metadataList.add( diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt index 9767683b..61c4930b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt @@ -8,7 +8,6 @@ import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.body.MediaTypeUtils import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus import pl.szczodrzynski.edziennik.data.api.models.ApiError @@ -64,17 +63,11 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { } if (data.isMessagesLoginValid()) { - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(data.messagesSessionId!!) - .domain("wiadomosci.librus.pl") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId) onSuccess() } else { - data.app.cookieJar.clearForDomain("wiadomosci.librus.pl") + data.app.cookieJar.clear("wiadomosci.librus.pl") if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_SYNERGIA)) { loginWithSynergia() } @@ -148,7 +141,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { } private fun saveSessionId(response: Response?, text: String?) { - var sessionId = data.app.cookieJar.getCookie("wiadomosci.librus.pl", "DZIENNIKSID") + var sessionId = data.app.cookieJar.get("wiadomosci.librus.pl", "DZIENNIKSID") sessionId = sessionId?.replace("-MAINT", "") // dunno what's this sessionId = sessionId?.replace("MAINT", "") // dunno what's this if (sessionId == null) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt index 68fa64ae..166a4ae5 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt @@ -37,19 +37,19 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) { } else if (data.portalRefreshToken != null) { if (data.fakeLogin) { - data.app.cookieJar.clearForDomain("librus.szkolny.eu") + data.app.cookieJar.clear("librus.szkolny.eu") } else { - data.app.cookieJar.clearForDomain("portal.librus.pl") + data.app.cookieJar.clear("portal.librus.pl") } accessToken(null, data.portalRefreshToken) } else { if (data.fakeLogin) { - data.app.cookieJar.clearForDomain("librus.szkolny.eu") + data.app.cookieJar.clear("librus.szkolny.eu") } else { - data.app.cookieJar.clearForDomain("portal.librus.pl") + data.app.cookieJar.clear("portal.librus.pl") } authorize(if (data.fakeLogin) FAKE_LIBRUS_AUTHORIZE else LIBRUS_AUTHORIZE_URL) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt index 00883ddb..4a292cfe 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt @@ -8,7 +8,6 @@ import com.google.gson.JsonObject import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi @@ -30,17 +29,11 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un } if (data.isSynergiaLoginValid()) { - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("DZIENNIKSID") - .value(data.synergiaSessionId!!) - .domain("synergia.librus.pl") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("synergia.librus.pl", "DZIENNIKSID", data.synergiaSessionId) onSuccess() } else { - data.app.cookieJar.clearForDomain("synergia.librus.pl") + data.app.cookieJar.clear("synergia.librus.pl") if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_API)) { loginWithApi() } @@ -92,7 +85,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un } if (location?.endsWith("centrum_powiadomien") == true) { - val sessionId = data.app.cookieJar.getCookie("synergia.librus.pl", "DZIENNIKSID") + val sessionId = data.app.cookieJar.get("synergia.librus.pl", "DZIENNIKSID") if (sessionId == null) { data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_SYNERGIA_NO_SESSION_ID) .withResponse(response) @@ -117,7 +110,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un } } - data.app.cookieJar.clearForDomain("synergia.librus.pl") + data.app.cookieJar.clear("synergia.librus.pl") Request.builder() .url(LIBRUS_SYNERGIA_TOKEN_LOGIN_URL.replace("TOKEN", token) + "/uczen/widok/centrum_powiadomien") .userAgent(LIBRUS_USER_AGENT) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt index be0dad0f..cfb4ab49 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt @@ -8,7 +8,6 @@ import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.callback.FileCallbackHandler import im.wangchao.mhttp.callback.TextCallbackHandler -import okhttp3.Cookie import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik import pl.szczodrzynski.edziennik.data.api.models.ApiError @@ -105,18 +104,8 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L } } - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name(data.webSessionKey!!) - .value(data.webSessionValue!!) - .domain("${data.loginServerName}.mobidziennik.pl") - .secure().httpOnly().build(), - Cookie.Builder() - .name("SERVERID") - .value(data.webServerId!!) - .domain("${data.loginServerName}.mobidziennik.pl") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", data.webSessionKey, data.webSessionValue) + data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", "SERVERID", data.webServerId) Request.builder() .url(url) @@ -187,18 +176,8 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L } } - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name(data.webSessionKey!!) - .value(data.webSessionValue!!) - .domain("${data.loginServerName}.mobidziennik.pl") - .secure().httpOnly().build(), - Cookie.Builder() - .name("SERVERID") - .value(data.webServerId!!) - .domain("${data.loginServerName}.mobidziennik.pl") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", data.webSessionKey, data.webSessionValue) + data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", "SERVERID", data.webServerId) Request.builder() .url(url) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt index dbd3f86f..78526b0c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt @@ -26,7 +26,7 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit } else { if (data.loginServerName.isNotNullNorEmpty() && data.loginUsername.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) { - data.app.cookieJar.clearForDomain(data.loginServerName + ".mobidziennik.pl") + data.app.cookieJar.clear("${data.loginServerName}.mobidziennik.pl") loginWithCredentials() } else { @@ -58,10 +58,10 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit } } - val cookies = data.app.cookieJar.getForDomain("${data.loginServerName}.mobidziennik.pl") - val cookie = cookies.singleOrNull { it.name().length > 32 } - val sessionKey = cookie?.name() - val sessionId = cookie?.value() + val cookies = data.app.cookieJar.getAll("${data.loginServerName}.mobidziennik.pl") + val cookie = cookies.entries.firstOrNull { it.key.length > 32 } + val sessionKey = cookie?.key + val sessionId = cookie?.value if (sessionId == null) { data.error(ApiError(TAG, ERROR_LOGIN_MOBIDZIENNIK_WEB_NO_SESSION_ID) .withResponse(response) @@ -71,7 +71,7 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit data.webSessionKey = sessionKey data.webSessionValue = sessionId - data.webServerId = data.app.cookieJar.getCookie("${data.loginServerName}.mobidziennik.pl", "SERVERID") + data.webServerId = data.app.cookieJar.get("${data.loginServerName}.mobidziennik.pl", "SERVERID") data.webSessionIdExpiryTime = response.getUnixDate() + 45 * 60 /* 45min */ onSuccess() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt index e0a85722..dcf569cf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt @@ -4,7 +4,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.template -import okhttp3.Cookie import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_TEMPLATE_API @@ -28,13 +27,7 @@ class DataTemplate(app: App, profile: Profile?, loginStore: LoginStore) : Data(a loginMethods.clear() if (isWebLoginValid()) { loginMethods += LOGIN_METHOD_TEMPLATE_WEB - app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("AuthCookie") - .value(webCookie!!) - .domain("eregister.example.com") - .secure().httpOnly().build() - )) + app.cookieJar.set("eregister.example.com", "AuthCookie", webCookie) } if (isApiLoginValid()) loginMethods += LOGIN_METHOD_TEMPLATE_API diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt index fac39d50..d7a24ef0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt @@ -4,12 +4,11 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.template.login -import okhttp3.Cookie +import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_DATA_MISSING import pl.szczodrzynski.edziennik.data.api.ERROR_PROFILE_MISSING import pl.szczodrzynski.edziennik.data.api.edziennik.template.DataTemplate import pl.szczodrzynski.edziennik.data.api.models.ApiError -import pl.szczodrzynski.edziennik.currentTimeUnix class TemplateLoginWeb(val data: DataTemplate, val onSuccess: () -> Unit) { companion object { @@ -23,17 +22,11 @@ class TemplateLoginWeb(val data: DataTemplate, val onSuccess: () -> Unit) { } if (data.isWebLoginValid()) { - data.app.cookieJar.saveFromResponse(null, listOf( - Cookie.Builder() - .name("AuthCookie") - .value(data.webCookie!!) - .domain("eregister.example.com") - .secure().httpOnly().build() - )) + data.app.cookieJar.set("eregister.example.com", "AuthCookie", data.webCookie) onSuccess() } else { - data.app.cookieJar.clearForDomain("eregister.example.com") + data.app.cookieJar.clear("eregister.example.com") if (/*data.webLogin != null && data.webPassword != null && */true) { loginWithCredentials() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt new file mode 100644 index 00000000..75b60309 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) Kuba SzczodrzyƄski 2020-3-24. + */ + +package pl.szczodrzynski.edziennik.network.cookie + +import okhttp3.Cookie + +class DumbCookie(var cookie: Cookie) { + + constructor(domain: String, name: String, value: String, expiresAt: Long? = null) : this( + Cookie.Builder() + .name(name) + .value(value) + .also { if (expiresAt != null) it.expiresAt(expiresAt) } + .domain(domain) + .build() + ) + + init { + cookie = Cookie.Builder() + .name(cookie.name()) + .value(cookie.value()) + .expiresAt(cookie.expiresAt()) + .domain(cookie.domain()) + .build() + } + + fun domainMatches(host: String): Boolean { + val domain = cookie.domain() + return host == domain || host.endsWith(".$domain") + } + + override fun equals(other: Any?): Boolean { + if (other !is DumbCookie) return false + if (this.cookie === other.cookie) return true + + return cookie.name() == other.cookie.name() + && cookie.domain() == other.cookie.domain() + } + + override fun hashCode(): Int { + var hash = 17 + hash = 31 * hash + cookie.name().hashCode() + hash = 31 * hash + cookie.domain().hashCode() + return hash + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt b/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt new file mode 100644 index 00000000..ca11996f --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt @@ -0,0 +1,103 @@ +/* + * Copyright (c) Kuba SzczodrzyƄski 2020-3-24. + */ + +package pl.szczodrzynski.edziennik.network.cookie + +import android.content.Context +import okhttp3.Cookie +import okhttp3.CookieJar +import okhttp3.HttpUrl + +/** + * A simple cookie jar that does not care about the [Cookie.secure], [Cookie.hostOnly], + * [Cookie.httpOnly] and [Cookie.path] attributes. + */ +class DumbCookieJar( + /** + * A context to create the shared prefs file. + */ + context: Context, + + /** + * Whether to persist session cookies as well, when [Cookie.persistent] is false. + */ + private val persistAll: Boolean = false +) : CookieJar { + + private val prefs = context.getSharedPreferences("cookies", Context.MODE_PRIVATE) + private val sessionCookies = mutableSetOf() + private val savedCookies = mutableSetOf() + private fun save(dc: DumbCookie) { + sessionCookies.remove(dc) + sessionCookies.add(dc) + if (dc.cookie.persistent() || persistAll) { + savedCookies.remove(dc) + savedCookies.add(dc) + } + } + private fun delete(vararg toRemove: DumbCookie) { + sessionCookies.removeAll(toRemove) + savedCookies.removeAll(toRemove) + } + + override fun saveFromResponse(url: HttpUrl?, cookies: List) { + for (cookie in cookies) { + val dc = DumbCookie(cookie) + save(dc) + } + } + + override fun loadForRequest(url: HttpUrl): List { + return sessionCookies.filter { + it.cookie.matches(url) + }.map { it.cookie } + } + + fun get(domain: String, name: String): String? { + return sessionCookies.firstOrNull { + it.domainMatches(domain) && it.cookie.name() == name + }?.cookie?.value() + } + + fun set(domain: String, name: String, value: String?, isSession: Boolean) = set( + domain, name, value, + if (isSession) null + else System.currentTimeMillis() + 365 * 24 * 60 * 60 * 1000L + ) + + /** + * Add a cookie to the cache. + * By default a session cookie is added. If [expiresAt] is set, the cookie is + * additionally persisted. + */ + fun set(domain: String, name: String?, value: String?, expiresAt: Long? = null) { + name ?: return + if (value == null) { + remove(domain, name) + return + } + val dc = DumbCookie(domain, name, value, expiresAt) + save(dc) + } + + fun getAll(domain: String): Map { + return sessionCookies.filter { + it.domainMatches(domain) + }.map { it.cookie.name() to it.cookie.value() }.toMap() + } + + fun remove(domain: String, name: String) { + val toRemove = sessionCookies.filter { + it.domainMatches(domain) && it.cookie.name() == name + } + delete(*toRemove.toTypedArray()) + } + + fun clear(domain: String) { + val toRemove = sessionCookies.filter { + it.domainMatches(domain) + } + delete(*toRemove.toTypedArray()) + } +}