Skip to content

Commit 67126e2

Browse files
fix: Kotlin login_user method works properly now
1 parent f10faa2 commit 67126e2

2 files changed

Lines changed: 79 additions & 10 deletions

File tree

‎kotlin/src/main/com/looker/rtl/AuthSession.kt‎

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,13 +295,20 @@ open class AuthSession(
295295
if (sudoId.isNotBlank()) {
296296
val token = activeToken()
297297
val sudoToken =
298-
transport.request<AuthToken>(HttpMethod.POST, "/login/$newId") { requestSettings ->
299-
val headers = requestSettings.headers.toMutableMap()
300-
if (token.accessToken.isNotBlank()) {
301-
headers["Authorization"] = "token ${token.accessToken}"
302-
}
303-
requestSettings.copy(headers = headers)
304-
}
298+
transport.request<AuthToken>(
299+
HttpMethod.POST,
300+
"/login/$newId",
301+
authenticator = { requestSettings ->
302+
val headers = requestSettings.headers.toMutableMap()
303+
fetchIapToken()?.let { iapToken ->
304+
headers["Proxy-Authorization"] = "Bearer $iapToken"
305+
}
306+
if (token.accessToken.isNotBlank()) {
307+
headers["Authorization"] = "token ${token.accessToken}"
308+
}
309+
requestSettings.copy(headers = headers)
310+
},
311+
)
305312
this.sudoToken = ok(sudoToken)
306313
}
307314
return activeToken()

‎kotlin/src/test/TestAuthSession.kt‎

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,26 @@
2222
* THE SOFTWARE.
2323
*/
2424

25+
import com.google.api.client.http.HttpTransport
26+
import com.google.api.client.http.LowLevelHttpRequest
27+
import com.google.api.client.http.LowLevelHttpResponse
2528
import com.looker.rtl.AuthSession
2629
import com.looker.rtl.OAuthSession
2730
import com.looker.rtl.Transport
31+
import com.looker.rtl.TransportOptions
2832
import org.junit.Test
33+
import java.io.ByteArrayInputStream
2934
import java.io.File
35+
import java.io.InputStream
3036
import kotlin.test.assertEquals
3137
import kotlin.test.assertFalse
3238
import kotlin.test.assertTrue
3339

3440
@ExperimentalUnsignedTypes
3541
class TestAuthSession {
36-
val config = TestConfig()
37-
val settings = config.settings
38-
val testSettings = config.testSettings(settings)
42+
val config by lazy { TestConfig() }
43+
val settings by lazy { config.settings }
44+
val testSettings by lazy { config.testSettings(settings) }
3945

4046
@Test
4147
fun testTestFiles() {
@@ -73,6 +79,62 @@ class TestAuthSession {
7379
assertFalse(session.isAuthenticated())
7480
}
7581

82+
@Test
83+
fun testSudoLoginUsesApiPrefixAndAuthHeader() {
84+
val mockSettings = MockSettings(bareMinimum)
85+
val requests = mutableListOf<Pair<String, String>>()
86+
val requestHeaders = mutableListOf<Map<String, String>>()
87+
88+
val mockHttpTransport = object : HttpTransport() {
89+
override fun buildRequest(method: String, url: String): LowLevelHttpRequest {
90+
return object : LowLevelHttpRequest() {
91+
private val headers = mutableMapOf<String, String>()
92+
93+
override fun addHeader(name: String, value: String) {
94+
headers[name] = value
95+
}
96+
97+
override fun execute(): LowLevelHttpResponse {
98+
requests.add(method to url)
99+
requestHeaders.add(headers.toMap())
100+
val responseJson = if (url.endsWith("/login")) {
101+
"""{"access_token":"admin_token","token_type":"Bearer","expires_in":3600}"""
102+
} else {
103+
"""{"access_token":"sudo_token","token_type":"Bearer","expires_in":3600}"""
104+
}
105+
return object : LowLevelHttpResponse() {
106+
override fun getContent(): InputStream =
107+
ByteArrayInputStream(responseJson.toByteArray(Charsets.UTF_8))
108+
override fun getContentEncoding(): String? = null
109+
override fun getContentLength(): Long = responseJson.length.toLong()
110+
override fun getContentType(): String = "application/json"
111+
override fun getStatusLine(): String = "HTTP/1.1 200 OK"
112+
override fun getStatusCode(): Int = 200
113+
override fun getReasonPhrase(): String = "OK"
114+
override fun getHeaderCount(): Int = 0
115+
override fun getHeaderName(index: Int): String? = null
116+
override fun getHeaderValue(index: Int): String? = null
117+
}
118+
}
119+
}
120+
}
121+
}
122+
123+
val mockTransport = object : Transport(mockSettings) {
124+
override fun initTransport(options: TransportOptions): HttpTransport = mockHttpTransport
125+
}
126+
127+
val session = AuthSession(mockSettings, mockTransport)
128+
val token = session.login("user_123")
129+
130+
assertEquals(2, requests.size)
131+
assertEquals("POST" to "https://my.looker.com:19999/api/4.0/login", requests[0])
132+
assertEquals("POST" to "https://my.looker.com:19999/api/4.0/login/user_123", requests[1])
133+
assertEquals("token admin_token", requestHeaders[1]["Authorization"])
134+
assertTrue(session.isSudo())
135+
assertEquals("sudo_token", token.accessToken)
136+
}
137+
76138
@Test
77139
fun testSha256() {
78140
val session = OAuthSession(settings, Transport(testSettings))

0 commit comments

Comments
 (0)