diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/DataLibrus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/DataLibrus.kt index d7437d77..139545cc 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/DataLibrus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/DataLibrus.kt @@ -137,6 +137,25 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app get() { mSynergiaSessionIdExpiryTime = mSynergiaSessionIdExpiryTime ?: profile?.getStudentData("accountSIDTime", 0L); return mSynergiaSessionIdExpiryTime ?: 0L } set(value) { profile?.putStudentData("accountSIDTime", value) ?: return; mSynergiaSessionIdExpiryTime = value } + + /** + * A Messages web Session ID (DZIENNIKSID). + * Used in endpoints with Messages login method. + */ + private var mMessagesSessionId: String? = null + var messagesSessionId: String? + get() { mMessagesSessionId = mMessagesSessionId ?: profile?.getStudentData("messagesSID", null); return mMessagesSessionId } + set(value) { profile?.putStudentData("messagesSID", value) ?: return; mMessagesSessionId = value } + /** + * The expiry time for [messagesSessionId], as a UNIX timestamp. + * Used in endpoints with Messages login method. + * TODO verify how long is the session ID valid. + */ + private var mMessagesSessionIdExpiryTime: Long? = null + var messagesSessionIdExpiryTime: Long + get() { mMessagesSessionIdExpiryTime = mMessagesSessionIdExpiryTime ?: profile?.getStudentData("messagesSIDTime", 0L); return mMessagesSessionIdExpiryTime ?: 0L } + set(value) { profile?.putStudentData("messagesSIDTime", value) ?: return; mMessagesSessionIdExpiryTime = value } + /* ____ _ _ / __ \| | | | | | | | |_| |__ ___ _ __ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusMessages.kt index 26e3db39..1f6667bf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusMessages.kt @@ -4,5 +4,43 @@ package pl.szczodrzynski.edziennik.api.v2.librus.login -class LoginLibrusMessages { +import pl.szczodrzynski.edziennik.api.v2.* +import pl.szczodrzynski.edziennik.api.v2.librus.data.DataLibrus +import pl.szczodrzynski.edziennik.currentTimeUnix +import pl.szczodrzynski.edziennik.isNotNullNorEmpty + +class LoginLibrusMessages(val data: DataLibrus, val onSuccess: () -> Unit) { + companion object { + private const val TAG = "LoginLibrusMessages" + } + + init { run { + if (data.profile == null) { + data.error(TAG, ERROR_PROFILE_MISSING) + return@run + } + + if (data.messagesSessionIdExpiryTime-30 > currentTimeUnix() && data.messagesSessionId.isNotNullNorEmpty()) { + onSuccess() + } + else { + when (data.loginStore.mode) { + LOGIN_MODE_LIBRUS_SYNERGIA -> loginWithCredentials() + else -> { + loginWithSynergia() + } + } + } + }} + + private fun loginWithCredentials() { + if (data.apiLogin == null || data.apiPassword == null) { + if (!data.loginMethods.contains(LOGIN_METHOD_LIBRUS_SYNERGIA)) { + data.error(TAG, ERROR_LOGIN_METHOD_NOT_SATISFIED) + return + } + data.error(TAG, ERROR_LOGIN_DATA_MISSING) + return + } + } } \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusSynergia.kt index 0134347d..e78cd860 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusSynergia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginLibrusSynergia.kt @@ -7,7 +7,6 @@ package pl.szczodrzynski.edziennik.api.v2.librus.login import com.google.gson.JsonObject import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response -import im.wangchao.mhttp.body.MediaTypeUtils import im.wangchao.mhttp.callback.JsonCallbackHandler import im.wangchao.mhttp.callback.TextCallbackHandler import okhttp3.HttpUrl @@ -34,11 +33,14 @@ class LoginLibrusSynergia(val data: DataLibrus, val onSuccess: () -> Unit) { onSuccess() } else { - when (data.loginStore.mode) { - LOGIN_MODE_LIBRUS_SYNERGIA -> loginWithSynergia() - else -> { - loginWithApi() - } + if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_API)) { + loginWithApi() + } + else if (data.apiLogin != null && data.apiPassword != null) { + loginWithCredentials() + } + else { + data.error(TAG, ERROR_LOGIN_DATA_MISSING) } } }} @@ -46,11 +48,7 @@ class LoginLibrusSynergia(val data: DataLibrus, val onSuccess: () -> Unit) { /** * HTML form-based login method. Uses a Synergia login and password. */ - private fun loginWithSynergia() { - if (data.apiLogin == null || data.apiPassword == null) { - data.error(TAG, ERROR_LOGIN_DATA_MISSING) - return - } + private fun loginWithCredentials() { } @@ -58,11 +56,6 @@ class LoginLibrusSynergia(val data: DataLibrus, val onSuccess: () -> Unit) { * A login method using the Synergia API (AutoLoginToken endpoint). */ private fun loginWithApi() { - if (!data.loginMethods.contains(LOGIN_METHOD_LIBRUS_API)) { - data.error(TAG, ERROR_LOGIN_METHOD_NOT_SATISFIED) - return - } - val onSuccess = { json: JsonObject -> loginWithToken(json.getString("Token")) }