package com.ov3rk1ll.kinocast.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.ov3rk1ll.kinocast.api.Parser;
import com.ov3rk1ll.kinocast.ui.MainActivity;
import java.io.IOException;
import okhttp3.Cookie;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
@SuppressWarnings("deprecation")
public class CloudflareDdosInterceptor implements Interceptor {
private static final String TAG = CloudflareDdosInterceptor.class.getSimpleName();
private Context context;
public CloudflareDdosInterceptor(Context context) {
this.context = context;
}
@Override
public Response intercept(final Chain chain) throws IOException {
final Request request = chain.request();
final Response response = chain.proceed(request);
if(response.code() == 503) {
Log.d(TAG, "intercept: Status " + response.code() + " for " + request.url());
Log.v(TAG, "intercept: try to handle request to " + request.url().toString());
String body = response.body().string();
final boolean[] requestDone = {false};
final String[] solvedUrl = {null};
if (body.contains("DDoS protection by Cloudflare") && !request.url().toString().contains("/cdn-cgi/l/chk_jschl")) {
MainActivity.activity.runOnUiThread(new Runnable() {
@SuppressLint("SetJavaScriptEnabled")
@Override
public void run() {
// Virtual WebView
final WebView webView = MainActivity.webView;
// Delete all cookies
CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context);
cookieSyncMngr.startSync();
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.removeSessionCookie();
cookieSyncMngr.stopSync();
cookieSyncMngr.sync();
cookieManager.setCookie(request.url().toString(), response.header("Set-Cookie"));
cookieSyncMngr.sync();
webView.setVisibility(View.GONE);
webView.clearCache(true);
webView.getSettings().setUserAgentString(Utils.USER_AGENT);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String raw = CookieManager.getInstance().getCookie(url);
Log.v("CloudflareDdos", "shouldOverrideUrlLoading: wants to load " + url + " with cookies " + raw);
solvedUrl[0] = url;
requestDone[0] = true;
return true;
}
});
webView.loadUrl(request.url().toString());
Log.v("CloudflareDdos", "load " + request.url().toString() + " in webview");
}
});
int timeout = 50;
// Wait for the webView to load the correct url
while (!requestDone[0]){
SystemClock.sleep(200);
timeout--;
if(timeout <= 0)
break;
}
if(solvedUrl[0] != null) {
// Store the cookies from the WebView in the OkHttpClient's jar
InjectedCookieJar jar = (InjectedCookieJar) Parser.getInstance().getClient().cookieJar();
String raw = CookieManager.getInstance().getCookie(solvedUrl[0]);
Log.v("CloudflareDdos", "load " + solvedUrl[0] + ", raw-cookies=" + raw);
String[] cookies = raw.split(";");
for (String c : cookies) {
jar.addCookie(Cookie.parse(request.url(), c.trim()));
}
// call the check url to get and store the correct cookies
Parser.getInstance().getBody(solvedUrl[0]);
// run the action request again
Log.v(TAG, "intercept: will retry request to " + request.url());
return chain.proceed(request);
}
return response;
}
}
return response;
}
}