Add support for new AccountInactiveException error message

This commit is contained in:
Mikołaj Pich 2024-01-21 16:19:28 +01:00
parent c900846ca9
commit 1056a1ff2a
5 changed files with 124 additions and 16 deletions

View file

@ -95,15 +95,16 @@ internal class AutoLoginInterceptor(
val messages = getModuleCookies(UrlGenerator.Site.MESSAGES) val messages = getModuleCookies(UrlGenerator.Site.MESSAGES)
val student = getModuleCookies(UrlGenerator.Site.STUDENT) val student = getModuleCookies(UrlGenerator.Site.STUDENT)
val studentPlus = if (isEduOne) { val studentPlus = when {
getModuleCookies(UrlGenerator.Site.STUDENT_PLUS) isEduOne -> getModuleCookies(UrlGenerator.Site.STUDENT_PLUS)
} else null else -> null
}
when { when {
"wiadomosciplus" in uri.host -> messages.getOrThrow() "wiadomosciplus" in uri.host -> messages.getOrThrow()
"uczenplus" in uri.host -> studentPlus?.getOrThrow() "uczenplus" in uri.host -> studentPlus?.getOrThrow()
"uczen" in uri.host -> student.getOrThrow() "uczen" in uri.host -> student.getOrThrow()
else -> logger.info("Resource don't need further login") else -> logger.info("Resource don't need further login anyway")
} }
chain.proceed(chain.request().attachModuleHeaders()) chain.proceed(chain.request().attachModuleHeaders())
} catch (e: IOException) { } catch (e: IOException) {

View file

@ -81,6 +81,9 @@ internal class ErrorInterceptor(
doc.select("h2.error").let { doc.select("h2.error").let {
if (it.isNotEmpty()) throw AccountPermissionException(it.text()) if (it.isNotEmpty()) throw AccountPermissionException(it.text())
} }
doc.select("h2").text().let {
if (it == "Strona nie znaleziona") throw ScrapperException(it, httpCode)
}
doc.selectFirst("form")?.attr("action")?.let { doc.selectFirst("form")?.attr("action")?.let {
if ("SetNewPassword" in it) { if ("SetNewPassword" in it) {
@ -94,13 +97,18 @@ internal class ErrorInterceptor(
throw AccountInactiveException(it.select(".additionalText").text()) throw AccountInactiveException(it.select(".additionalText").text())
} }
} }
doc.select(".info-error-message-text").let {
if ("Nie masz wystarczających uprawnień" in it.text()) {
throw AccountInactiveException(it.text())
}
}
when (doc.title()) { when (doc.title()) {
"Błąd" -> throw VulcanException(doc.body().text(), httpCode) "Błąd" -> throw VulcanException(doc.body().text(), httpCode)
"Błąd strony" -> throw VulcanException(doc.select(".errorMessage").text(), httpCode) "Błąd strony" -> throw VulcanException(doc.select(".errorMessage").text(), httpCode)
"Logowanie" -> throw AccountPermissionException( "Logowanie" -> throw AccountPermissionException(
buildString { buildString {
val newMessage = doc.select(".info-error-message-text").first()?.text().orEmpty() val newMessage = doc.select(".info-error-message-text").first()?.ownText().orEmpty()
val oldMessage = doc.select("div").last()?.ownText().orEmpty().split(" Jeśli")[0] val oldMessage = doc.select("div").last()?.ownText().orEmpty().split(" Jeśli")[0]
append(newMessage.ifBlank { oldMessage }) append(newMessage.ifBlank { oldMessage })
}, },
@ -121,9 +129,6 @@ internal class ErrorInterceptor(
"Strona nie została odnaleziona" -> throw ScrapperException(doc.title(), httpCode) "Strona nie została odnaleziona" -> throw ScrapperException(doc.title(), httpCode)
"Strona nie znaleziona" -> throw ScrapperException(doc.selectFirst("div div")?.text().orEmpty(), httpCode) "Strona nie znaleziona" -> throw ScrapperException(doc.selectFirst("div div")?.text().orEmpty(), httpCode)
} }
doc.select("h2").text().let {
if (it == "Strona nie znaleziona") throw ScrapperException(it, httpCode)
}
if (isBobCmn(doc, redirectUrl)) { if (isBobCmn(doc, redirectUrl)) {
throw ConnectionBlockedException("Połączenie zablokowane przez system antybotowy. Spróbuj ponownie za chwilę") throw ConnectionBlockedException("Połączenie zablokowane przez system antybotowy. Spróbuj ponownie za chwilę")
} }

View file

@ -8,6 +8,7 @@ import io.github.wulkanowy.sdk.scrapper.exception.VulcanException
import io.github.wulkanowy.sdk.scrapper.interceptor.ErrorInterceptorTest import io.github.wulkanowy.sdk.scrapper.interceptor.ErrorInterceptorTest
import io.github.wulkanowy.sdk.scrapper.service.LoginService import io.github.wulkanowy.sdk.scrapper.service.LoginService
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
@ -120,19 +121,31 @@ class LoginTest : BaseLocalTest() {
} }
@Test @Test
fun accessAccountInactiveException() { fun accessAccountInactiveException() = runTest {
with(server) { with(server) {
enqueue("Logowanie-uonet.html") enqueue("Logowanie-uonet.html")
enqueue("Logowanie-nieaktywne.html") enqueue("Logowanie-nieaktywne.html")
start(3000) start(3000)
} }
try { val result = runCatching { normal.login("jan@fakelog.cf", "jan1234") }
runBlocking { normal.login("jan@fakelog.cf", "jan1234") } val error = result.exceptionOrNull()!!
} catch (e: Throwable) { assertEquals(AccountInactiveException::class, error::class)
assertEquals(AccountInactiveException::class, e::class) assertEquals("Login i hasło użytkownika są poprawne, ale konto nie jest aktywne w żadnej jednostce sprawozdawczej", error.message)
assertEquals("Login i hasło użytkownika są poprawne, ale konto nie jest aktywne w żadnej jednostce sprawozdawczej", e.message) }
@Test
fun accessAccountInactiveNewException() = runTest {
with(server) {
enqueue("Logowanie-uonet.html")
enqueue("Logowanie-nieaktywne2.html")
start(3000)
} }
val result = runCatching { normal.login("jan@fakelog.cf", "jan1234") }
val error = result.exceptionOrNull()!!
assertEquals(AccountInactiveException::class, error::class)
assertEquals("Nie masz wystarczających uprawnień, by używać aplikacji", error.message)
} }
@Test @Test
@ -165,18 +178,32 @@ class LoginTest : BaseLocalTest() {
} }
@Test @Test
fun accessPermissionException() { fun accessPermissionException() = runTest {
with(server) { with(server) {
enqueue("Logowanie-uonet.html") enqueue("Logowanie-uonet.html")
enqueue("Logowanie-brak-dostepu.html") enqueue("Logowanie-brak-dostepu.html")
start(3000) start(3000)
} }
val result = runCatching { adfs.login("jan@fakelog.cf", "jan1234") }
val exception = result.exceptionOrNull()!!
assertEquals(AccountPermissionException::class, exception::class)
assertEquals("Adres nie został zarejestrowany w dzienniku uczniowskim jako adres rodzica, bądź ucznia.", exception.message)
}
@Test
fun accessPermissionNewException() {
with(server) {
enqueue("Logowanie-uonet.html")
enqueue("Logowanie-brak-dostepu2.html")
start(3000)
}
try { try {
runBlocking { adfs.login("jan@fakelog.cf", "jan1234") } runBlocking { adfs.login("jan@fakelog.cf", "jan1234") }
} catch (e: Throwable) { } catch (e: Throwable) {
assertTrue(e is AccountPermissionException) assertTrue(e is AccountPermissionException)
assertEquals("Adres mikolajpich@gmail.com nie został zarejestrowany w dzienniku uczniowskim jako adres rodzica, bądź ucznia.", e.message) assertEquals("Login nie został zarejestrowany w bazie szkoły, do której się logujesz.", e.message)
} }
} }

View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Logowanie</title>
</head>
<body>
<form method="post" action="./LoginEndpoint.aspx?__customer__group=powiatwulkanowy&amp;__customer__symbol=" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTM0MjUyMzM2OWRk0gXlR1z7JdsJG359rlaIHF0NGtk="/>
</div>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="14C11D55"/>
</div>
<div class="startScreen startScreen-start">
<div class="info-error-content-info">
<span class="info-error-message-text">
Login <b>jan@fakelog.cf</b> nie został zarejestrowany w bazie szkoły, do której się logujesz.
</span>
<span class="info-error-message-text">
Sprawdź poprawność wpisanego w pasku przeglądarki adresu strony.
<br/>
Każda szkoła ma unikalny adres dziennika.
<br/>
Adres strony startowej systemu przekazuje szkoła i jest to jedyne źródło pozyskania prawidłowego adresu witryny.
<br/>
Adres strony systemu należy wpisać do górnego paska przeglądarki, nie do wyszukiwarki Google.
<br/>
Większość szkół publikuje odnośnik do systemu na swojej stronie www.
</span>
<span class="info-error-message-text">
W drugiej kolejności skontaktuj się z sekretarzem w szkole lub wychowawcą.
</span>
<a href="/powiatwulkanowy/" class="extra-button extra-button-gray" title="Powrót do strony głównej"><span>Powrót do strony głównej</span></a>
<a href="/powiatwulkanowy/LoginEndpoint.aspx?logout=true" class="extra-button extra-button-gray"><span>Wyloguj</span></a>
</div>
<div class="bottomBar">
<span>
<a class="appVersion" href="http://www.vulcan.edu.pl/" title="VULCAN sp. z o.o." target="_blank">VULCAN sp. z o.o., Dziennik VULCAN, wersja 23.15.0011.57737</a>
</span>
</div>
</div>
</form>
</body>
</html>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="pl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dziennik VULCAN</title>
</head>
<body>
<div class="startScreen startScreen-start">
<div class="info-error-content-info">
<span class="info-error-message-text">Nie masz wystarczających uprawnień, by używać aplikacji</span>
<a href="https://uonetplus.fakelog.cf/powiatwulkanowy/" class="extra-button extra-button-gray"><span>Odśwież</span></a>
<a href="https://uonetplus.fakelog.cf/powiatwulkanowy/LoginEndpoint.aspx?logout=true"
class="extra-button extra-button-gray"><span>Wyloguj</span></a>
</div>
<div class="bottomBar">
<span>
<a class="appVersion" href="http://www.vulcan.edu.pl/" title="VULCAN sp. z o.o." target="_blank">VULCAN sp. z o.o., Dziennik VULCAN, wersja 23.15.0011.57737</a>
</span>
</div>
</div>
</body>
</html>