Skip to content

Commit 0caddf3

Browse files
authored
Merge pull request #487 from vimeo/fixing-path-traversal-bugs
Allow prepopulated query parameters while disallowing path traversal and other hosts
2 parents 350ead2 + 0011a84 commit 0caddf3

File tree

4 files changed

+244
-217
lines changed

4 files changed

+244
-217
lines changed

api-core/src/main/java/com/vimeo/networking2/config/RetrofitSetupModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.vimeo.networking2.ApiConstants
2727
import com.vimeo.networking2.internal.ErrorHandlingCallAdapterFactory
2828
import com.vimeo.networking2.internal.interceptor.AcceptHeaderInterceptor
2929
import com.vimeo.networking2.internal.interceptor.CacheControlHeaderInterceptor
30+
import com.vimeo.networking2.internal.interceptor.HostValidationInterceptor
3031
import com.vimeo.networking2.internal.interceptor.LanguageHeaderInterceptor
3132
import com.vimeo.networking2.internal.interceptor.UserAgentHeaderInterceptor
3233
import com.vimeo.networking2.internal.params.StringValueJsonAdapterFactory
@@ -62,6 +63,7 @@ object RetrofitSetupModule {
6263
@JvmStatic
6364
fun retrofit(vimeoApiConfiguration: VimeoApiConfiguration): Retrofit {
6465
val interceptors = mutableListOf(
66+
HostValidationInterceptor(vimeoApiConfiguration),
6567
UserAgentHeaderInterceptor(vimeoApiConfiguration.compositeUserAgent),
6668
AcceptHeaderInterceptor(),
6769
LanguageHeaderInterceptor(vimeoApiConfiguration.locales)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.vimeo.networking2.internal.interceptor
2+
3+
import com.vimeo.networking2.config.VimeoApiConfiguration
4+
import okhttp3.HttpUrl
5+
import okhttp3.Interceptor
6+
import okhttp3.Response
7+
import okio.IOException
8+
9+
/**
10+
* An interceptor that ensures that only requests to the host specified in the [VimeoApiConfiguration] are made. This
11+
* prevents unexpected requests from being made to other hosts.
12+
*
13+
* @param vimeoApiConfiguration The configuration used to determine the expected host.
14+
*/
15+
class HostValidationInterceptor(private val vimeoApiConfiguration: VimeoApiConfiguration) : Interceptor {
16+
private val httpUrl = HttpUrl.parse(vimeoApiConfiguration.baseUrl)
17+
18+
override fun intercept(chain: Interceptor.Chain): Response =
19+
if (chain.request().url().host() != httpUrl?.host()) {
20+
throw IOException("Host must match specified base URL, was ${chain.request().url().host()}, " +
21+
"expected ${httpUrl?.host()}")
22+
} else {
23+
chain.proceed(chain.request())
24+
}
25+
}

0 commit comments

Comments
 (0)