aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-01-26 16:30:51 -0600
committerIván Ávalos <avalos@disroot.org>2022-01-26 16:30:51 -0600
commite369918a12347884898d7c3e9bebf92731db55d5 (patch)
tree89fde7b7db1692c4c0b04d3df0593374710ca1bd
parentb4785c42aa026a561674257955a7c59b8c964e6f (diff)
downloadetbsa-trackermap-mobile-e369918a12347884898d7c3e9bebf92731db55d5.tar.gz
etbsa-trackermap-mobile-e369918a12347884898d7c3e9bebf92731db55d5.tar.bz2
etbsa-trackermap-mobile-e369918a12347884898d7c3e9bebf92731db55d5.zip
Disabled automatic storage of cookies in iOS engine (https://youtrack.jetbrains.com/issue/KTOR-3748), so we can handle them manually.
-rw-r--r--iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/avalos.xcuserdatad/UserInterfaceState.xcuserstatebin31113 -> 29011 bytes
-rw-r--r--iosApp/iosApp/Authentication/LoginView.swift12
-rw-r--r--iosApp/iosApp/iOSApp.swift19
-rw-r--r--shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt10
-rw-r--r--shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt10
-rw-r--r--shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt11
-rw-r--r--shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt7
-rw-r--r--shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt11
-rw-r--r--shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt16
9 files changed, 54 insertions, 42 deletions
diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/avalos.xcuserdatad/UserInterfaceState.xcuserstate b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/avalos.xcuserdatad/UserInterfaceState.xcuserstate
index 56eaa32..a056117 100644
--- a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/avalos.xcuserdatad/UserInterfaceState.xcuserstate
+++ b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/avalos.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/iosApp/iosApp/Authentication/LoginView.swift b/iosApp/iosApp/Authentication/LoginView.swift
index ba07753..7b1e63e 100644
--- a/iosApp/iosApp/Authentication/LoginView.swift
+++ b/iosApp/iosApp/Authentication/LoginView.swift
@@ -6,11 +6,17 @@ struct LoginContainerView: View {
@State private var password = ""
@State private var server = ""
- private var sessionController = SessionController(
- sessionApi: SessionApi(defaultBaseUrl: "https://etbsa.net/api"),
- usersApi: UsersApi(defaultBaseUrl: "https://etbsa.net/api"))
+ private let sessionManager = SessionManager(
+ defaultBaseUrl: "https://etbsa.net/api"
+ )
+
+ private var sessionController: SessionController
init() {
+ sessionController = SessionController(
+ sessionApi: SessionApi(sessionManager: sessionManager),
+ usersApi: UsersApi(sessionManager: sessionManager))
+
sessionController.loginStateFlow.collect(collector: Collector<SessionController.LoginState?> { state in
print("State is: \(state?.debugDescription ?? "")")
}) { (unit, error) in
diff --git a/iosApp/iosApp/iOSApp.swift b/iosApp/iosApp/iOSApp.swift
index cbc2ffd..26c93f1 100644
--- a/iosApp/iosApp/iOSApp.swift
+++ b/iosApp/iosApp/iOSApp.swift
@@ -3,25 +3,6 @@ import shared
@main
struct iOSApp: App {
- let defaultServer = "https://etbsa.net/"
-
- var sessionApi: SessionApi
- var usersApi: UsersApi
- var devicesApi: DevicesApi
- var positionsApi: PositionsApi
- var commandsApi: CommandsApi
- var reportsApi: ReportsApi
- var geofencesApi: GeofencesApi
-
- init() {
- sessionApi = SessionApi(defaultBaseUrl: defaultServer)
- usersApi = UsersApi(defaultBaseUrl: defaultServer)
- devicesApi = DevicesApi(defaultBaseUrl: defaultServer)
- positionsApi = PositionsApi(defaultBaseUrl: defaultServer)
- commandsApi = CommandsApi(defaultBaseUrl: defaultServer)
- reportsApi = ReportsApi(defaultBaseUrl: defaultServer)
- geofencesApi = GeofencesApi(defaultBaseUrl: defaultServer)
- }
var body: some Scene {
WindowGroup {
diff --git a/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
new file mode 100644
index 0000000..8b43d20
--- /dev/null
+++ b/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
@@ -0,0 +1,10 @@
+package mx.trackermap.TrackerMap.client.infrastructure
+
+import io.ktor.client.*
+import io.ktor.client.engine.cio.*
+
+actual class HttpClientProvider {
+ actual fun getHttpClient(): HttpClient {
+ return HttpClient(CIO)
+ }
+} \ No newline at end of file
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt
index a5a893e..6d9dbea 100644
--- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt
+++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt
@@ -11,13 +11,9 @@
*/
package mx.trackermap.TrackerMap.client.apis
-import com.russhwolf.settings.Settings
import mx.trackermap.TrackerMap.client.models.User
import mx.trackermap.TrackerMap.client.infrastructure.*
-const val SERVER_URL_KEY = "server_url"
-const val ACCESS_TOKEN_KEY = "access_token"
-
class SessionApi(sessionManager: SessionManager) : ApiClient(sessionManager) {
/**
@@ -36,8 +32,7 @@ class SessionApi(sessionManager: SessionManager) : ApiClient(sessionManager) {
return when (response.responseType) {
ResponseType.Success -> {
- val settings = Settings()
- settings.remove(ACCESS_TOKEN_KEY)
+ sessionManager.clearSession()
}
ResponseType.Informational -> TODO()
ResponseType.Redirection -> TODO()
@@ -102,14 +97,13 @@ class SessionApi(sessionManager: SessionManager) : ApiClient(sessionManager) {
return when (response.responseType) {
ResponseType.Success -> {
+ print("Response headers = ${response.headers.values}\n")
val cookie = response.headers
.values
.flatten()
.find { it.contains("JSESSIONID") }!!
.replace("; Path=/", "")
this.sessionManager.token = cookie
- val settings = Settings()
- settings.putString(ACCESS_TOKEN_KEY, cookie)
(response as Success<*>).data as User
}
ResponseType.Informational -> TODO()
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt
index 385ece4..78bcf3b 100644
--- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt
+++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt
@@ -17,7 +17,6 @@
*/
package mx.trackermap.TrackerMap.client.infrastructure
-import com.russhwolf.settings.Settings
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.features.*
@@ -32,8 +31,6 @@ import io.ktor.client.request.forms.FormDataContent
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.util.*
-import mx.trackermap.TrackerMap.client.apis.ACCESS_TOKEN_KEY
-import mx.trackermap.TrackerMap.client.apis.SERVER_URL_KEY
import kotlinx.serialization.json.Json as KotlinJson
open class ApiClient(
@@ -47,7 +44,7 @@ open class ApiClient(
protected const val ApiFormURLType = "application/x-www-form-urlencoded"
protected const val ApiXmlMediaType = "application/xml"
- val client: HttpClient = HttpClient {
+ val client: HttpClient = HttpClientProvider().getHttpClient().config {
install(HttpTimeout) {
connectTimeoutMillis = 20_000
requestTimeoutMillis = 20_000
@@ -71,12 +68,6 @@ open class ApiClient(
ApiContentType to ApiJsonMediaType,
ApiAccept to ApiJsonMediaType
)
-
- val jsonHeaders: Map<String, String> =
- mapOf(
- ApiContentType to ApiJsonMediaType,
- ApiAccept to ApiJsonMediaType
- )
}
protected inline fun <reified T> fillRequest(
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
new file mode 100644
index 0000000..873722f
--- /dev/null
+++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
@@ -0,0 +1,7 @@
+package mx.trackermap.TrackerMap.client.infrastructure
+
+import io.ktor.client.*
+
+expect class HttpClientProvider() {
+ fun getHttpClient(): HttpClient
+} \ No newline at end of file
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt
index 306533c..6287b0c 100644
--- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt
+++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt
@@ -3,13 +3,16 @@ package mx.trackermap.TrackerMap.client.infrastructure
import com.russhwolf.settings.Settings
import com.russhwolf.settings.get
import com.russhwolf.settings.set
-import mx.trackermap.TrackerMap.client.apis.ACCESS_TOKEN_KEY
-import mx.trackermap.TrackerMap.client.apis.SERVER_URL_KEY
class SessionManager(
private val defaultBaseUrl: String
) {
+ companion object {
+ const val SERVER_URL_KEY = "server_url"
+ const val ACCESS_TOKEN_KEY = "access_token"
+ }
+
private val settings = Settings()
var baseUrl: String
@@ -24,4 +27,8 @@ class SessionManager(
settings[ACCESS_TOKEN_KEY] = token
}
+ fun clearSession() {
+ settings.remove(ACCESS_TOKEN_KEY)
+ settings.remove(SERVER_URL_KEY)
+ }
} \ No newline at end of file
diff --git a/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
new file mode 100644
index 0000000..1ccb2e6
--- /dev/null
+++ b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt
@@ -0,0 +1,16 @@
+package mx.trackermap.TrackerMap.client.infrastructure
+
+import io.ktor.client.*
+import io.ktor.client.engine.ios.*
+
+actual class HttpClientProvider {
+ actual fun getHttpClient(): HttpClient {
+ return HttpClient(Ios) {
+ engine {
+ configureSession {
+ HTTPCookieStorage = null
+ }
+ }
+ }
+ }
+} \ No newline at end of file