diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index 66d7adaf..d7181f1b 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -1,11 +1,9 @@ -

Wersja 4.2, 2020-05-16

+

Wersja 4.2.1, 2020-05-21



diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp index f90eb9ef..2b2922e6 100644 --- a/app/src/main/cpp/szkolny-signing.cpp +++ b/app/src/main/cpp/szkolny-signing.cpp @@ -9,7 +9,7 @@ /*secret password - removed for source code publication*/ static toys AES_IV[16] = { - 0x3b, 0xa6, 0xd4, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + 0x43, 0xfc, 0x2d, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index 568538e7..bea90a98 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -43,6 +43,7 @@ import pl.szczodrzynski.edziennik.sync.SyncWorker import pl.szczodrzynski.edziennik.sync.UpdateWorker import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity import pl.szczodrzynski.edziennik.utils.* +import pl.szczodrzynski.edziennik.utils.Utils.d import pl.szczodrzynski.edziennik.utils.managers.* import java.util.concurrent.TimeUnit import kotlin.coroutines.CoroutineContext @@ -257,6 +258,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { val pushMobidziennikApp = FirebaseApp.initializeApp( this@App, FirebaseOptions.Builder() + .setProjectId("mobidziennik") + .setStorageBucket("mobidziennik.appspot.com") + .setDatabaseUrl("https://mobidziennik.firebaseio.com") + .setGcmSenderId("747285019373") .setApiKey("AIzaSyCi5LmsZ5BBCQnGtrdvWnp1bWLCNP8OWQE") .setApplicationId("1:747285019373:android:f6341bf7b158621d") .build(), @@ -266,6 +271,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { val pushLibrusApp = FirebaseApp.initializeApp( this@App, FirebaseOptions.Builder() + .setProjectId("synergiadru") + .setStorageBucket("synergiadru.appspot.com") + .setDatabaseUrl("https://synergiadru.firebaseio.com") + .setGcmSenderId("513056078587") .setApiKey("AIzaSyDfTuEoYPKdv4aceEws1CO3n0-HvTndz-o") .setApplicationId("1:513056078587:android:1e29083b760af544") .build(), @@ -275,6 +284,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { val pushVulcanApp = FirebaseApp.initializeApp( this@App, FirebaseOptions.Builder() + .setProjectId("dzienniczekplus") + .setStorageBucket("dzienniczekplus.appspot.com") + .setDatabaseUrl("https://dzienniczekplus.firebaseio.com") + .setGcmSenderId("987828170337") .setApiKey("AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA") .setApplicationId("1:987828170337:android:ac97431a0a4578c3") .build(), @@ -284,10 +297,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { try { FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult -> val token = instanceIdResult.token + d("Firebase", "Got App token: $token") config.sync.tokenApp = token } FirebaseInstanceId.getInstance(pushMobidziennikApp).instanceId.addOnSuccessListener { instanceIdResult -> val token = instanceIdResult.token + d("Firebase", "Got Mobidziennik2 token: $token") if (token != config.sync.tokenMobidziennik) { config.sync.tokenMobidziennik = token config.sync.tokenMobidziennikList = listOf() @@ -295,6 +310,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { } FirebaseInstanceId.getInstance(pushLibrusApp).instanceId.addOnSuccessListener { instanceIdResult -> val token = instanceIdResult.token + d("Firebase", "Got Librus token: $token") if (token != config.sync.tokenLibrus) { config.sync.tokenLibrus = token config.sync.tokenLibrusList = listOf() @@ -302,6 +318,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { } FirebaseInstanceId.getInstance(pushVulcanApp).instanceId.addOnSuccessListener { instanceIdResult -> val token = instanceIdResult.token + d("Firebase", "Got Vulcan token: $token") if (token != config.sync.tokenVulcan) { config.sync.tokenVulcan = token config.sync.tokenVulcanList = listOf() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt index ee52cf1a..60d0da59 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt @@ -92,7 +92,7 @@ val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT const val VULCAN_API_USER_AGENT = "MobileUserAgent" const val VULCAN_API_APP_NAME = "VULCAN-Android-ModulUcznia" -const val VULCAN_API_APP_VERSION = "19.4.1.436" +const val VULCAN_API_APP_VERSION = "20.5.1.470" const val VULCAN_API_PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06" const val VULCAN_API_PASSWORD_FAKELOG = "012345678901234567890123456789AB" val VULCAN_API_DEVICE_NAME = "Szkolny.eu ${Build.MODEL}" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt index aa3fac8d..b21a38bb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt @@ -40,7 +40,7 @@ object Regexes { """\(([0-9A-ząęóżźńśłć]*?)\)$""".toRegex(DOT_MATCHES_ALL) } val MOBIDZIENNIK_LUCKY_NUMBER by lazy { - """class="szczesliwy_numerek".*>0*([0-9]+)(?:/0*[0-9]+)*""".toRegex(DOT_MATCHES_ALL) + """class="szczesliwy_numerek".*?>0?([0-9]+)/?0?([0-9]+)?""".toRegex(DOT_MATCHES_ALL) } val MOBIDZIENNIK_CLASS_CALENDAR by lazy { """events: (.+),$""".toRegex(RegexOption.MULTILINE) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt index af5ff9d7..985b9899 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt @@ -102,7 +102,7 @@ open class PodlasieApi(open val data: DataPodlasie, open val lastSync: Long?) { .also { it.timeZone = TimeZone.getTimeZone("Europe/Warsaw") }.format(System.currentTimeMillis()) val instance = MessageDigest.getInstance("SHA-256") val digest = instance.digest("-EYlwYu8u16miVd8tT?oO7cvoUVQrQN0vr!$format".toByteArray()).toHexString() - val digest2 = instance.digest(data.apiToken!!.toByteArray()).toHexString() + val digest2 = instance.digest((data.apiToken ?: "").toByteArray()).toHexString() return instance.digest("$digest$digest2".toByteArray()).toHexString() } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt index 0cf1c895..ec84cd05 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt @@ -15,6 +15,7 @@ import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiUpdateSemester import pl.szczodrzynski.edziennik.data.api.models.ApiError +import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi import pl.szczodrzynski.edziennik.utils.Utils.d import java.net.HttpURLConnection.HTTP_BAD_REQUEST import java.util.* @@ -202,6 +203,13 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) { val deviceNameSuffix = " - nie usuwać" + val szkolnyApi = SzkolnyApi(data.app) + val firebaseToken = szkolnyApi.runCatching({ + getFirebaseToken("vulcan") + }, onError = { + // screw errors + }) ?: data.app.config.sync.tokenVulcan + Request.builder() .url("${data.apiUrl}$VULCAN_API_ENDPOINT_CERTIFICATE") .userAgent(VULCAN_API_USER_AGENT) @@ -220,6 +228,7 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) { .addParameter("AppVersion", VULCAN_API_APP_VERSION) .addParameter("RemoteMobileAppVersion", VULCAN_API_APP_VERSION) .addParameter("RemoteMobileAppName", VULCAN_API_APP_NAME) + .addParameter("FirebaseTokenKey", firebaseToken ?: "") .postJson() .allowErrorCode(HTTP_BAD_REQUEST) .callback(callback) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt index ae82ff8f..d2b4df70 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt @@ -335,4 +335,10 @@ class SzkolnyApi(val app: App) : CoroutineScope { return parseResponse(response) } + + @Throws(Exception::class) + fun getFirebaseToken(registerName: String): String { + val response = api.firebaseToken(registerName).execute() + return parseResponse(response) + } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt index bce3aef0..401d8886 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt @@ -35,4 +35,7 @@ interface SzkolnyService { @GET("appLogin/platforms/{registerName}") fun appLoginPlatforms(@Path("registerName") registerName: String): Call>> + + @GET("firebase/token/{registerName}") + fun firebaseToken(@Path("registerName") registerName: String): Call> } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt index 6741a01a..343c0c8b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt @@ -46,6 +46,6 @@ object Signing { /*fun provideKey(param1: String, param2: Long): ByteArray {*/ fun pleaseStopRightNow(param1: String, param2: Long): ByteArray { - return "$param1.MTIzNDU2Nzg5MDCEfzNqNH===.$param2".sha256() + return "$param1.MTIzNDU2Nzg5MDtTu0zYCV===.$param2".sha256() } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java index 88323bc1..3604b83d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java @@ -112,7 +112,9 @@ public class Date implements Comparable { Calendar c = Calendar.getInstance(); c.set(Integer.parseInt(dateTime.substring(0, 4)), Integer.parseInt(dateTime.substring(5, 7)) - 1, Integer.parseInt(dateTime.substring(8, 10)), Integer.parseInt(dateTime.substring(11, 13)), Integer.parseInt(dateTime.substring(14, 16)), Integer.parseInt(dateTime.substring(17, 19))); c.set(Calendar.MILLISECOND, 0); - c.setTimeZone(TimeZone.getTimeZone("UTC")); + if (dateTime.endsWith("Z")) { + c.setTimeZone(TimeZone.getTimeZone("UTC")); + } return c.getTimeInMillis(); } catch (Exception e) { diff --git a/build.gradle b/build.gradle index d0a75f54..6224a05e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.3.61' release = [ - versionName: "4.2", - versionCode: 4020099 + versionName: "4.2.1", + versionCode: 4020199 ] setup = [