mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-10-31 16:22:49 +00:00
Do not append the application MapTiler key to a custom map style url
When a homeserver publishes a map_style_url in its .well-known file, the app appended its own MapTiler API key to it, producing a URL with two query strings that the tile server rejects. The map then failed to load for every user of that homeserver, with no way for the operator to opt out. MapTilerTileServerStyleUriBuilder.build() now appends ?key= only to the URL it composes itself from the bundled base url and map ids. A non blank customMapStyleUrl is returned verbatim, so the operator's own credentials survive. This matches Element Web and the self-hosted tile server documentation, both of which treat map_style_url as complete. The two existing tests that pinned the old behaviour are updated, and cases are added for a custom URL that already carries a key, one that carries an unrelated query string, and a blank url falling back to the built-in style. Relates to https://github.com/element-hq/element-x-android/issues/7289
This commit is contained in:
+9
-8
@@ -29,14 +29,15 @@ internal class MapTilerTileServerStyleUriBuilder(
|
||||
customMapStyleUrl: String?,
|
||||
darkMode: Boolean,
|
||||
): String {
|
||||
return buildString {
|
||||
if (customMapStyleUrl.isNullOrBlank()) {
|
||||
val mapId = if (darkMode) darkMapId else lightMapId
|
||||
append("$baseUrl/$mapId/style.json")
|
||||
} else {
|
||||
append(customMapStyleUrl)
|
||||
}
|
||||
append("?key=$apiKey")
|
||||
return if (customMapStyleUrl.isNullOrBlank()) {
|
||||
val mapId = if (darkMode) darkMapId else lightMapId
|
||||
"$baseUrl/$mapId/style.json?key=$apiKey"
|
||||
} else {
|
||||
// A custom style url comes from the homeserver .well-known and is expected to be complete:
|
||||
// it already carries the operator's own credentials, if any. Appending our api key to it
|
||||
// adds a second query string and breaks the request.
|
||||
// See https://github.com/element-hq/element-x-android/issues/7289
|
||||
customMapStyleUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+32
-2
@@ -46,7 +46,7 @@ class MapTilerTileServerStyleUriBuilderTest {
|
||||
customMapStyleUrl = "https://custom.url/style.json",
|
||||
darkMode = false,
|
||||
)
|
||||
).isEqualTo("https://custom.url/style.json?key=anApiKey")
|
||||
).isEqualTo("https://custom.url/style.json")
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -56,6 +56,36 @@ class MapTilerTileServerStyleUriBuilderTest {
|
||||
customMapStyleUrl = "https://custom.url/style.json",
|
||||
darkMode = true,
|
||||
)
|
||||
).isEqualTo("https://custom.url/style.json?key=anApiKey")
|
||||
).isEqualTo("https://custom.url/style.json")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `custom map uri with its own api key is not altered`() {
|
||||
assertThat(
|
||||
builder.build(
|
||||
customMapStyleUrl = "https://api.maptiler.com/maps/streets-v2/style.json?key=anOperatorKey",
|
||||
darkMode = false,
|
||||
)
|
||||
).isEqualTo("https://api.maptiler.com/maps/streets-v2/style.json?key=anOperatorKey")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `custom map uri with an existing query is not altered`() {
|
||||
assertThat(
|
||||
builder.build(
|
||||
customMapStyleUrl = "https://self.hosted/style.json?foo=bar",
|
||||
darkMode = true,
|
||||
)
|
||||
).isEqualTo("https://self.hosted/style.json?foo=bar")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `blank custom map uri falls back to the built-in style`() {
|
||||
assertThat(
|
||||
builder.build(
|
||||
customMapStyleUrl = " ",
|
||||
darkMode = false,
|
||||
)
|
||||
).isEqualTo("https://base.url/aLightMapId/style.json?key=anApiKey")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user