Element call URL must have https scheme.

This commit is contained in:
Benoit Marty 2023-09-26 15:41:31 +02:00
parent 6eed650ad0
commit 4e658be3cc
3 changed files with 29 additions and 10 deletions

View file

@ -39,7 +39,6 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" /> <data android:scheme="https" />
<data android:host="call.element.io" /> <data android:host="call.element.io" />

View file

@ -21,7 +21,7 @@ import javax.inject.Inject
class CallIntentDataParser @Inject constructor() { class CallIntentDataParser @Inject constructor() {
private val validHttpSchemes = sequenceOf("http", "https") private val validHttpSchemes = sequenceOf("https")
fun parse(data: String?): String? { fun parse(data: String?): String? {
val parsedUrl = data?.let { Uri.parse(data) } ?: return null val parsedUrl = data?.let { Uri.parse(data) } ?: return null

View file

@ -52,13 +52,17 @@ class CallIntentDataParserTests {
} }
@Test @Test
fun `Element Call urls will be returned as is`() { fun `Element Call http urls returns null`() {
val httpBaseUrl = "http://call.element.io" val httpBaseUrl = "http://call.element.io"
val httpCallUrl = "http://call.element.io/some-actual-call?with=parameters" val httpCallUrl = "http://call.element.io/some-actual-call?with=parameters"
assertThat(callIntentDataParser.parse(httpBaseUrl)).isNull()
assertThat(callIntentDataParser.parse(httpCallUrl)).isNull()
}
@Test
fun `Element Call urls will be returned as is`() {
val httpsBaseUrl = "https://call.element.io" val httpsBaseUrl = "https://call.element.io"
val httpsCallUrl = "https://call.element.io/some-actual-call?with=parameters" val httpsCallUrl = "https://call.element.io/some-actual-call?with=parameters"
assertThat(callIntentDataParser.parse(httpBaseUrl)).isEqualTo(httpBaseUrl)
assertThat(callIntentDataParser.parse(httpCallUrl)).isEqualTo(httpCallUrl)
assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo(httpsBaseUrl) assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo(httpsBaseUrl)
assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo(httpsCallUrl) assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo(httpsCallUrl)
} }
@ -76,18 +80,34 @@ class CallIntentDataParserTests {
} }
@Test @Test
fun `element scheme with call host and url param gets url extracted`() { fun `element scheme with call host and url with http will returns null`() {
val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "element://call?url=$encodedUrl" val url = "element://call?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isNull()
}
@Test
fun `element scheme with call host and url param gets url extracted`() {
val embeddedUrl = "https://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "element://call?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isEqualTo(embeddedUrl) assertThat(callIntentDataParser.parse(url)).isEqualTo(embeddedUrl)
} }
@Test @Test
fun `element scheme 2 with url param gets url extracted`() { fun `element scheme 2 with url param with http returns null`() {
val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "io.element.call:/?url=$encodedUrl" val url = "io.element.call:/?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isNull()
}
@Test
fun `element scheme 2 with url param gets url extracted`() {
val embeddedUrl = "https://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "io.element.call:/?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isEqualTo(embeddedUrl) assertThat(callIntentDataParser.parse(url)).isEqualTo(embeddedUrl)
} }
@ -101,7 +121,7 @@ class CallIntentDataParserTests {
@Test @Test
fun `element scheme 2 with no url returns null`() { fun `element scheme 2 with no url returns null`() {
val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" val embeddedUrl = "https://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "io.element.call:/?no_url=$encodedUrl" val url = "io.element.call:/?no_url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isNull() assertThat(callIntentDataParser.parse(url)).isNull()
@ -109,7 +129,7 @@ class CallIntentDataParserTests {
@Test @Test
fun `element scheme with no call host returns null`() { fun `element scheme with no call host returns null`() {
val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" val embeddedUrl = "https://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "element://no-call?url=$encodedUrl" val url = "element://no-call?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isNull() assertThat(callIntentDataParser.parse(url)).isNull()
@ -129,7 +149,7 @@ class CallIntentDataParserTests {
@Test @Test
fun `element invalid scheme returns null`() { fun `element invalid scheme returns null`() {
val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" val embeddedUrl = "https://call.element.io/some-actual-call?with=parameters"
val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8")
val url = "bad.scheme:/?url=$encodedUrl" val url = "bad.scheme:/?url=$encodedUrl"
assertThat(callIntentDataParser.parse(url)).isNull() assertThat(callIntentDataParser.parse(url)).isNull()