forked from github/szkolny
[API/Gdynia] Add web login.
This commit is contained in:
parent
cea5071a34
commit
3fcd47cf91
@ -122,3 +122,7 @@ const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
|||||||
const val PODLASIE_API_VERSION = "1.0.31"
|
const val PODLASIE_API_VERSION = "1.0.31"
|
||||||
const val PODLASIE_API_URL = "https://cpdklaser.zeto.bialystok.pl/api"
|
const val PODLASIE_API_URL = "https://cpdklaser.zeto.bialystok.pl/api"
|
||||||
const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia"
|
const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia"
|
||||||
|
|
||||||
|
const val GDYNIA_WEB_URL = "https://nasze.miasto.gdynia.pl/ed_miej"
|
||||||
|
const val GDYNIA_WEB_LOGIN = "login.pl"
|
||||||
|
const val GDYNIA_WEB_LOGIN_CHECK = "login_check.pl"
|
||||||
|
@ -206,6 +206,10 @@ const val ERROR_PODLASIE_API_NO_TOKEN = 630
|
|||||||
const val ERROR_PODLASIE_API_OTHER = 631
|
const val ERROR_PODLASIE_API_OTHER = 631
|
||||||
const val ERROR_PODLASIE_API_DATA_MISSING = 632
|
const val ERROR_PODLASIE_API_DATA_MISSING = 632
|
||||||
|
|
||||||
|
const val ERROR_LOGIN_GDYNIA_WEB_INVALID_CREDENTIALS = 701
|
||||||
|
const val ERROR_LOGIN_GDYNIA_WEB_MISSING_SESSION_ID = 709
|
||||||
|
const val ERROR_LOGIN_GDYNIA_WEB_OTHER = 710
|
||||||
|
|
||||||
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
||||||
|
|
||||||
const val EXCEPTION_API_TASK = 900
|
const val EXCEPTION_API_TASK = 900
|
||||||
|
@ -33,4 +33,43 @@ class DataGdynia(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
|
|||||||
var loginPassword: String?
|
var loginPassword: String?
|
||||||
get() { mLoginPassword = mLoginPassword ?: loginStore.getLoginData("password", null); return mLoginPassword }
|
get() { mLoginPassword = mLoginPassword ?: loginStore.getLoginData("password", null); return mLoginPassword }
|
||||||
set(value) { loginStore.putLoginData("password", value); mLoginPassword = value }
|
set(value) { loginStore.putLoginData("password", value); mLoginPassword = value }
|
||||||
|
|
||||||
|
/* __ __ _
|
||||||
|
\ \ / / | |
|
||||||
|
\ \ /\ / /__| |__
|
||||||
|
\ \/ \/ / _ \ '_ \
|
||||||
|
\ /\ / __/ |_) |
|
||||||
|
\/ \/ \___|_._*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
.-.
|
||||||
|
_.--"""".o/ .-.-._
|
||||||
|
__' ."""; { _J ,__ `.
|
||||||
|
; o\.-.`._.'J; ; / `- / ;
|
||||||
|
`--i`". `" .'; `._ __.' |
|
||||||
|
\ `""" \ `; :
|
||||||
|
`."-. ; ____/ /
|
||||||
|
`-.` `-.-' `"-..'
|
||||||
|
___ `;__.-'" `.
|
||||||
|
.-{_ `--._ /.-" `-.
|
||||||
|
/ ""T ""---...' _.-"" """-. `.
|
||||||
|
; / __.-"". `. `, _..
|
||||||
|
\ / __.-"" '. \ `.,__ .'L' }
|
||||||
|
`---"`-.__ __." .-. j `. : `. .' ,' /
|
||||||
|
"""" / \ : `. | F' \ ;
|
||||||
|
; `-._,L_,-""-. `-, ; ` ; /
|
||||||
|
`. 7 `-._ `.__/_ \/
|
||||||
|
\ _; \ _.' `-. /
|
||||||
|
`---" `.___,, ;"" \ .'
|
||||||
|
_/ ; `"
|
||||||
|
.-" _,-'
|
||||||
|
{ "";
|
||||||
|
;-.____.'`.
|
||||||
|
`. \ '. :
|
||||||
|
\ : : /
|
||||||
|
`':*/
|
||||||
|
private var mWebSid: String? = null
|
||||||
|
var webSid: String?
|
||||||
|
get() { mWebSid = mWebSid ?: loginStore.getLoginData("webSid", null); return mWebSid }
|
||||||
|
set(value) { loginStore.putLoginData("webSid", value); mWebSid = value }
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.utils.Utils
|
|||||||
|
|
||||||
class Gdynia(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
|
class Gdynia(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "Gdynia"
|
private const val TAG = "Gdynia"
|
||||||
}
|
}
|
||||||
|
|
||||||
val internalErrorList = mutableListOf<Int>()
|
val internalErrorList = mutableListOf<Int>()
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2020-5-17
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.login
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.R
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_GDYNIA_WEB
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.DataGdynia
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
|
||||||
|
class GdyniaLogin(val data: DataGdynia, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "GdyniaLogin"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
nextLoginMethod(onSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var cancelled = false
|
||||||
|
|
||||||
|
private fun nextLoginMethod(onSuccess: () -> Unit) {
|
||||||
|
if (data.targetLoginMethodIds.isEmpty()) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (cancelled) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
useLoginMethod(data.targetLoginMethodIds.removeAt(0)) { usedMethodId ->
|
||||||
|
data.progress(data.progressStep)
|
||||||
|
if (usedMethodId != -1)
|
||||||
|
data.loginMethods.add(usedMethodId)
|
||||||
|
nextLoginMethod(onSuccess)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun useLoginMethod(loginMethodId: Int, onSuccess: (usedMethodId: Int) -> Unit) {
|
||||||
|
// this should never be true
|
||||||
|
if (data.loginMethods.contains(loginMethodId)) {
|
||||||
|
onSuccess(-1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Utils.d(TAG, "Using login method $loginMethodId")
|
||||||
|
when (loginMethodId) {
|
||||||
|
LOGIN_METHOD_GDYNIA_WEB -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_login_gdynia_web)
|
||||||
|
GdyniaLoginWeb(data) { onSuccess(loginMethodId) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2020-5-17
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.login
|
||||||
|
|
||||||
|
import im.wangchao.mhttp.Request
|
||||||
|
import im.wangchao.mhttp.Response
|
||||||
|
import im.wangchao.mhttp.callback.TextCallbackHandler
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.DataGdynia
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
import pl.szczodrzynski.edziennik.get
|
||||||
|
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
||||||
|
import pl.szczodrzynski.edziennik.md5
|
||||||
|
|
||||||
|
class GdyniaLoginWeb(val data: DataGdynia, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "GdyniaLoginWeb"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
run {
|
||||||
|
if (data.isWebLoginValid()) {
|
||||||
|
data.app.cookieJar.set("nasze.miasto.gdynia.pl", "sid", data.webSid)
|
||||||
|
onSuccess()
|
||||||
|
} else {
|
||||||
|
data.app.cookieJar.clear("nasze.miasto.gdynia.pl")
|
||||||
|
if (data.loginUsername.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
|
||||||
|
loginWithCredentials()
|
||||||
|
} else {
|
||||||
|
data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loginWithCredentials() {
|
||||||
|
val checkCallback = object : TextCallbackHandler() {
|
||||||
|
override fun onSuccess(text: String?, response: Response?) {
|
||||||
|
val cookies = data.app.cookieJar.getAll("nasze.miasto.gdynia.pl")
|
||||||
|
|
||||||
|
data.webSid = cookies["sid"]
|
||||||
|
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(response: Response?, throwable: Throwable?) {
|
||||||
|
data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
|
||||||
|
.withResponse(response)
|
||||||
|
.withThrowable(throwable))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val loginCallback = object : TextCallbackHandler() {
|
||||||
|
override fun onSuccess(text: String?, response: Response?) {
|
||||||
|
if (text == null || response == null) {
|
||||||
|
data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY)
|
||||||
|
.withResponse(response))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val error = """<p class="logging_error">(.*?)</p>""".toRegex().find(text)?.get(1)?.trim()
|
||||||
|
|
||||||
|
error?.let { code ->
|
||||||
|
when (code) {
|
||||||
|
"Niepoprawna nazwa użytkownika lub hasło" -> ERROR_LOGIN_GDYNIA_WEB_INVALID_CREDENTIALS
|
||||||
|
else -> ERROR_LOGIN_GDYNIA_WEB_OTHER
|
||||||
|
}.let { errorCode ->
|
||||||
|
data.error(ApiError(TAG, errorCode)
|
||||||
|
.withApiResponse(text)
|
||||||
|
.withResponse(response))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val sid = "sid=(.*?)&".toRegex().find(text)?.get(1)
|
||||||
|
|
||||||
|
if (sid == null) {
|
||||||
|
data.error(ApiError(TAG, ERROR_LOGIN_GDYNIA_WEB_MISSING_SESSION_ID)
|
||||||
|
.withApiResponse(text)
|
||||||
|
.withResponse(response))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Request.builder()
|
||||||
|
.url("$GDYNIA_WEB_URL/$GDYNIA_WEB_LOGIN_CHECK")
|
||||||
|
.userAgent(SYSTEM_USER_AGENT)
|
||||||
|
.addParameter("sid", sid)
|
||||||
|
.addParameter("url_back", "")
|
||||||
|
.get()
|
||||||
|
.callback(checkCallback)
|
||||||
|
.build()
|
||||||
|
.enqueue()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(response: Response?, throwable: Throwable?) {
|
||||||
|
data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
|
||||||
|
.withResponse(response)
|
||||||
|
.withThrowable(throwable))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Request.builder()
|
||||||
|
.url("$GDYNIA_WEB_URL/$GDYNIA_WEB_LOGIN")
|
||||||
|
.userAgent(SYSTEM_USER_AGENT)
|
||||||
|
.addParameter("action", "set")
|
||||||
|
.addParameter("user", data.loginUsername)
|
||||||
|
.addParameter("login", "Zaloguj się")
|
||||||
|
.addParameter("pass_md5", data.loginPassword?.md5())
|
||||||
|
.addParameter("url_back", "")
|
||||||
|
.post()
|
||||||
|
.callback(loginCallback)
|
||||||
|
.build()
|
||||||
|
.enqueue()
|
||||||
|
}
|
||||||
|
}
|
@ -6,7 +6,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data
|
|||||||
|
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import im.wangchao.mhttp.Request
|
import im.wangchao.mhttp.Request
|
||||||
import im.wangchao.mhttp.RequestParams
|
|
||||||
import im.wangchao.mhttp.Response
|
import im.wangchao.mhttp.Response
|
||||||
import im.wangchao.mhttp.callback.JsonCallbackHandler
|
import im.wangchao.mhttp.callback.JsonCallbackHandler
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
@ -86,12 +85,11 @@ open class PodlasieApi(open val data: DataPodlasie, open val lastSync: Long?) {
|
|||||||
Request.builder()
|
Request.builder()
|
||||||
.url(url)
|
.url(url)
|
||||||
.userAgent(SYSTEM_USER_AGENT)
|
.userAgent(SYSTEM_USER_AGENT)
|
||||||
.requestParams(RequestParams(mapOf(
|
.addParameter("token", data.apiToken)
|
||||||
"token" to data.apiToken,
|
.addParameter("securityToken", getSecurityToken())
|
||||||
"securityToken" to getSecurityToken(),
|
.addParameter("mobileId", data.app.deviceId)
|
||||||
"mobileId" to data.app.deviceId,
|
.addParameter("ver", PODLASIE_API_VERSION)
|
||||||
"ver" to PODLASIE_API_VERSION
|
.get()
|
||||||
)))
|
|
||||||
.callback(callback)
|
.callback(callback)
|
||||||
.build()
|
.build()
|
||||||
.enqueue()
|
.enqueue()
|
||||||
|
@ -6,7 +6,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.template.login
|
|||||||
|
|
||||||
import pl.szczodrzynski.edziennik.currentTimeUnix
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_DATA_MISSING
|
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.edziennik.template.DataTemplate
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
|
||||||
@ -16,11 +15,6 @@ class TemplateLoginWeb(val data: DataTemplate, val onSuccess: () -> Unit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init { run {
|
init { run {
|
||||||
if (data.profile == null) {
|
|
||||||
data.error(ApiError(TAG, ERROR_PROFILE_MISSING))
|
|
||||||
return@run
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.isWebLoginValid()) {
|
if (data.isWebLoginValid()) {
|
||||||
data.app.cookieJar.set("eregister.example.com", "AuthCookie", data.webCookie)
|
data.app.cookieJar.set("eregister.example.com", "AuthCookie", data.webCookie)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
@ -166,6 +166,10 @@
|
|||||||
<string name="error_631" translatable="false">ERROR_PODLASIE_API_OTHER</string>
|
<string name="error_631" translatable="false">ERROR_PODLASIE_API_OTHER</string>
|
||||||
<string name="error_632" translatable="false">ERROR_PODLASIE_API_DATA_MISSING</string>
|
<string name="error_632" translatable="false">ERROR_PODLASIE_API_DATA_MISSING</string>
|
||||||
|
|
||||||
|
<string name="error_701" translatable="false">ERROR_LOGIN_GDYNIA_WEB_INVALID_CREDENTIALS</string>
|
||||||
|
<string name="error_709" translatable="false">ERROR_LOGIN_GDYNIA_WEB_MISSING_SESSION_ID</string>
|
||||||
|
<string name="error_710" translatable="false">ERROR_LOGIN_GDYNIA_WEB_OTHER</string>
|
||||||
|
|
||||||
<string name="error_801" translatable="false">ERROR_TEMPLATE_WEB_OTHER</string>
|
<string name="error_801" translatable="false">ERROR_TEMPLATE_WEB_OTHER</string>
|
||||||
|
|
||||||
<string name="error_900" translatable="false">EXCEPTION_API_TASK</string>
|
<string name="error_900" translatable="false">EXCEPTION_API_TASK</string>
|
||||||
@ -354,6 +358,10 @@
|
|||||||
<string name="error_631_reason">ERROR_PODLASIE_API_OTHER</string>
|
<string name="error_631_reason">ERROR_PODLASIE_API_OTHER</string>
|
||||||
<string name="error_632_reason">Brak danych. Zgłoś błąd programiście.</string>
|
<string name="error_632_reason">Brak danych. Zgłoś błąd programiście.</string>
|
||||||
|
|
||||||
|
<string name="error_701_reason">Niepoprawna nazwa użytkownika lub hasło</string>
|
||||||
|
<string name="error_709_reason">Brakujące ID sesji. Zgłoś błąd programiście.</string>
|
||||||
|
<string name="error_710_reason">Wystąpił błąd podczas logowania</string>
|
||||||
|
|
||||||
<string name="error_801_reason">ERROR_TEMPLATE_WEB_OTHER</string>
|
<string name="error_801_reason">ERROR_TEMPLATE_WEB_OTHER</string>
|
||||||
|
|
||||||
<string name="error_900_reason">Błąd synchronizacji. Upewnij się, że masz połączenie z internetem, a następnie zgłoś błąd.</string>
|
<string name="error_900_reason">Błąd synchronizacji. Upewnij się, że masz połączenie z internetem, a następnie zgłoś błąd.</string>
|
||||||
|
@ -1343,7 +1343,7 @@
|
|||||||
<string name="login_mode_vulcan_api_guide">Zaloguj się do dziennika Vulcan na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.</string>
|
<string name="login_mode_vulcan_api_guide">Zaloguj się do dziennika Vulcan na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.</string>
|
||||||
<string name="login_mode_vulcan_web_guide">Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN lub na miejskiej platformie.</string>
|
<string name="login_mode_vulcan_web_guide">Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN lub na miejskiej platformie.</string>
|
||||||
<string name="login_mode_mobidziennik_web_guide">Podaj dane, których używasz do logowania na stronie MobiDziennika. Jako adres serwera możesz wpisać adres strony internetowej, na której masz MobiDziennik.</string>
|
<string name="login_mode_mobidziennik_web_guide">Podaj dane, których używasz do logowania na stronie MobiDziennika. Jako adres serwera możesz wpisać adres strony internetowej, na której masz MobiDziennik.</string>
|
||||||
<string name="edziennik_progress_login_vulcan_web_main">Logowanie do dziennika Vulcan...</string>
|
<string name="edziennik_progress_login_vulcan_web_main">Logowanie do dziennika Vulcan…</string>
|
||||||
<string name="login_type_idziennik">iDziennik Progman / iUczniowie</string>
|
<string name="login_type_idziennik">iDziennik Progman / iUczniowie</string>
|
||||||
<string name="login_mode_idziennik_web">Zaloguj używając nazwy użytkownika i hasła</string>
|
<string name="login_mode_idziennik_web">Zaloguj używając nazwy użytkownika i hasła</string>
|
||||||
<string name="login_mode_idziennik_web_hint">Podaj dane, których używasz na stronie internetowej e-dziennika</string>
|
<string name="login_mode_idziennik_web_hint">Podaj dane, których używasz na stronie internetowej e-dziennika</string>
|
||||||
@ -1356,4 +1356,5 @@
|
|||||||
<string name="login_mode_podlasie_api">Zaloguj używając tokenu</string>
|
<string name="login_mode_podlasie_api">Zaloguj używając tokenu</string>
|
||||||
<string name="login_mode_podlasie_api_guide">Podaj token aplikacji mobilnej.</string>
|
<string name="login_mode_podlasie_api_guide">Podaj token aplikacji mobilnej.</string>
|
||||||
<string name="edziennik_progress_login_podlasie_api">Logowanie do PPE…</string>
|
<string name="edziennik_progress_login_podlasie_api">Logowanie do PPE…</string>
|
||||||
|
<string name="edziennik_progress_login_gdynia_web">Logowanie do dziennika gdyńskiego…</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user