Add support for new AccountInactiveException error message
This commit is contained in:
parent
c900846ca9
commit
1056a1ff2a
5 changed files with 124 additions and 16 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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ę")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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&__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>
|
|
@ -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>
|
Loading…
Reference in a new issue