Skip to content

Commit

Permalink
Moved getCsrfTokenCall() out of the data client
Browse files Browse the repository at this point in the history
  • Loading branch information
psh committed Jan 24, 2024
1 parent 008ce10 commit a0f56de
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package fr.free.nrw.commons.auth.csrf

import androidx.annotation.VisibleForTesting
import org.wikipedia.AppAdapter
import org.wikipedia.dataclient.Service
import org.wikipedia.dataclient.ServiceFactory
import org.wikipedia.dataclient.SharedPreferenceCookieManager
import org.wikipedia.dataclient.WikiSite
Expand All @@ -20,13 +19,13 @@ import java.util.concurrent.Executors.newSingleThreadExecutor

class CsrfTokenClient(private val csrfWikiSite: WikiSite) {
private var retries = 0
private var csrfTokenCall: Call<MwQueryResponse>? = null
private var csrfTokenCall: Call<MwQueryResponse?>? = null
private val loginClient = LoginClient()

@Throws(Throwable::class)
fun getTokenBlocking(): String {
var token = ""
val service = ServiceFactory.get(csrfWikiSite)
val service = ServiceFactory.get(csrfWikiSite, CsrfTokenInterface::class.java)
val userName = AppAdapter.get().getUserName()
val password = AppAdapter.get().getPassword()

Expand Down Expand Up @@ -63,7 +62,7 @@ class CsrfTokenClient(private val csrfWikiSite: WikiSite) {
}

@VisibleForTesting
fun request(service: Service, cb: Callback): Call<MwQueryResponse> =
fun request(service: CsrfTokenInterface, cb: Callback): Call<MwQueryResponse?> =
requestToken(service, object : Callback {
override fun success(token: String?) {
if (AppAdapter.get().isLoggedIn() && token == ANON_TOKEN) {
Expand All @@ -81,17 +80,17 @@ class CsrfTokenClient(private val csrfWikiSite: WikiSite) {
})

@VisibleForTesting
fun requestToken(service: Service, cb: Callback): Call<MwQueryResponse> {
fun requestToken(service: CsrfTokenInterface, cb: Callback): Call<MwQueryResponse?> {
val call = service.getCsrfTokenCall()
call.enqueue(object : retrofit2.Callback<MwQueryResponse> {
override fun onResponse(call: Call<MwQueryResponse>, response: Response<MwQueryResponse>) {
call.enqueue(object : retrofit2.Callback<MwQueryResponse?> {
override fun onResponse(call: Call<MwQueryResponse?>, response: Response<MwQueryResponse?>) {
if (call.isCanceled) {
return
}
cb.success(response.body()!!.query()!!.csrfToken())
}

override fun onFailure(call: Call<MwQueryResponse>, t: Throwable) {
override fun onFailure(call: Call<MwQueryResponse?>, t: Throwable) {
if (call.isCanceled) {
return
}
Expand All @@ -110,7 +109,7 @@ class CsrfTokenClient(private val csrfWikiSite: WikiSite) {
login(userName, password, callback) {
Timber.i("retrying...")
cancel()
csrfTokenCall = request(ServiceFactory.get(csrfWikiSite), callback)
csrfTokenCall = request(ServiceFactory.get(csrfWikiSite, CsrfTokenInterface::class.java), callback)
}
} else {
callback.failure(caught())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fr.free.nrw.commons.auth.csrf

import org.wikipedia.dataclient.Service
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Headers

interface CsrfTokenInterface {
@Headers("Cache-Control: no-cache")
@GET(Service.MW_API_PREFIX + "action=query&meta=tokens&type=csrf")
fun getCsrfTokenCall(): Call<MwQueryResponse?>
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class CsrfTokenClientTest : MockWebServerTest() {
}

private fun performRequest() {
subject.request(service(Service::class.java), cb)
subject.request(service(CsrfTokenInterface::class.java), cb)
server().takeRequest()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -192,10 +192,6 @@ public interface Service {

// ------- CSRF, Login, and Create Account -------

@Headers("Cache-Control: no-cache")
@GET(MW_API_PREFIX + "action=query&meta=tokens&type=csrf")
@NonNull Call<MwQueryResponse> getCsrfTokenCall();

@Headers("Cache-Control: no-cache")
@GET(MW_API_PREFIX + "action=query&meta=tokens&type=csrf")
@NonNull Observable<MwQueryResponse> getCsrfToken();
Expand Down

0 comments on commit a0f56de

Please sign in to comment.