diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt
index 268da24e..f676772b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt
@@ -127,6 +127,7 @@ const val ERROR_LIBRUS_API_DEVICE_REGISTERED = 185
const val ERROR_LIBRUS_MESSAGES_NOT_FOUND = 186
const val ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST = 187
const val ERROR_LIBRUS_MESSAGES_ATTACHMENT_NOT_FOUND = 188
+const val ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT = 189
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN = 201
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD = 202
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
new file mode 100644
index 00000000..94ab5ed1
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2020-5-8.
+ */
+
+package pl.szczodrzynski.edziennik.data.api.edziennik.librus
+
+import android.content.Context
+import android.webkit.WebView
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import pl.szczodrzynski.edziennik.startCoroutineTimer
+import kotlin.coroutines.CoroutineContext
+
+class LibrusRecaptchaHelper(
+ val context: Context,
+ url: String,
+ html: String,
+ val onSuccess: (url: String) -> Unit,
+ val onTimeout: () -> Unit
+) : CoroutineScope {
+ companion object {
+ private const val TAG = "LibrusRecaptchaHelper"
+ }
+
+ private val job: Job = Job()
+ override val coroutineContext: CoroutineContext
+ get() = job + Dispatchers.Default
+
+ private val webView by lazy {
+ WebView(context).also {
+ it.settings.javaScriptEnabled = true
+ it.webViewClient = WebViewClient()
+ }
+ }
+
+ private var timeout: Job? = null
+
+ inner class WebViewClient : android.webkit.WebViewClient() {
+ override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
+ timeout?.cancel()
+ onSuccess(url)
+ return true
+ }
+ }
+
+ init {
+ launch(Dispatchers.Main) {
+ webView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null)
+ }
+ timeout = startCoroutineTimer(delayMillis = 10000L) {
+ onTimeout()
+ }
+ }
+}
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 ba8bcf76..94404232 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
@@ -10,6 +10,7 @@ import im.wangchao.mhttp.body.MediaTypeUtils
import im.wangchao.mhttp.callback.TextCallbackHandler
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
+import pl.szczodrzynski.edziennik.data.api.edziennik.librus.LibrusRecaptchaHelper
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.getUnixDate
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -35,6 +36,19 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
onSuccess()
}
+ text?.contains("grecaptcha.ready") == true -> {
+ val url = response?.request()?.url()?.toString() ?: run {
+ data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
+ return
+ }
+
+ LibrusRecaptchaHelper(data.app, url, text, onSuccess = { newUrl ->
+ loginWithSynergia(newUrl)
+ }, onTimeout = {
+ data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT, response, text)
+ })
+ }
+
text?.contains("ok") == true -> {
saveSessionId(response, text)
onSuccess()
@@ -46,6 +60,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
text?.contains("error") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text)
text?.contains("eVarWhitThisNameNotExists") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
text?.contains("") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
+ else -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
}
}
diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml
index 8e9e043b..db856eb0 100644
--- a/app/src/main/res/values/errors.xml
+++ b/app/src/main/res/values/errors.xml
@@ -99,6 +99,7 @@
ERROR_LIBRUS_MESSAGES_NOT_FOUND
ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST
ERROR_LIBRUS_MESSAGES_ATTACHMENT_NOT_FOUND
+ ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT
ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN
ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD
@@ -277,6 +278,7 @@
Nie znaleziono wiadomości. Mogła zostać usunięta.
Nieprawidłowe dane dostępu. Sprawdź poprawność wprowadzonych danych.
Nie znaleziono załącznika. Mógł zostać usunięty.
+ Logowanie Librus Wiadomości: ReCaptcha przekroczono czas oczekiwania.
Nieprawidłowy login lub hasło
Podano stare hasło