From 37476be2fe31778edcd4edcb34035f44c1203738 Mon Sep 17 00:00:00 2001
From: Rolando Lecca <90949336+bapeey@users.noreply.github.com>
Date: Thu, 13 Jul 2023 11:52:34 -0500
Subject: [PATCH] Manhwas.net: bypass sucuri (#17093)

* Bypass Sucuri

* Use jsoup to find script

* Use CookieManager

* Use CookieManager
---
 src/es/manhwasnet/build.gradle                |  2 +-
 .../extension/es/manhwasnet/ManhwasNet.kt     | 50 ++++++++++++++++---
 2 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/src/es/manhwasnet/build.gradle b/src/es/manhwasnet/build.gradle
index d993e87a4..bc0f63c17 100644
--- a/src/es/manhwasnet/build.gradle
+++ b/src/es/manhwasnet/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'Manhwas.net'
     pkgNameSuffix = 'es.manhwasnet'
     extClass = '.ManhwasNet'
-    extVersionCode = 6
+    extVersionCode = 7
     isNsfw = true
 }
 
diff --git a/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt
index ed3ff9ab3..395948677 100644
--- a/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt
+++ b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt
@@ -1,5 +1,7 @@
 package eu.kanade.tachiyomi.extension.es.manhwasnet
 
+import android.webkit.CookieManager
+import app.cash.quickjs.QuickJs
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.source.model.Filter
 import eu.kanade.tachiyomi.source.model.FilterList
@@ -7,10 +9,15 @@ import eu.kanade.tachiyomi.source.model.Page
 import eu.kanade.tachiyomi.source.model.SChapter
 import eu.kanade.tachiyomi.source.model.SManga
 import eu.kanade.tachiyomi.source.online.ParsedHttpSource
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Cookie
+import okhttp3.CookieJar
+import okhttp3.HttpUrl
 import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
 import okhttp3.Request
 import org.jsoup.nodes.Document
 import org.jsoup.nodes.Element
+import java.io.IOException
 import java.util.Calendar
 
 class ManhwasNet : ParsedHttpSource() {
@@ -20,20 +27,47 @@ class ManhwasNet : ParsedHttpSource() {
     override val name: String = "Manhwas.net"
     override val supportsLatest: Boolean = true
 
-    override val client = network.cloudflareClient.newBuilder()
+    private val cookieManager by lazy { CookieManager.getInstance() }
+
+    override val client = network.client.newBuilder()
         .addInterceptor { chain ->
-            val originalRequest = chain.request()
-            val url = originalRequest.url.toString()
-            val response = chain.proceed(originalRequest)
+            val request = chain.request()
+            val url = request.url.toString()
+            val response = chain.proceed(request)
             if (response.headers["x-sucuri-cache"].isNullOrEmpty() && url.startsWith(baseUrl) && response.headers["x-sucuri-id"] != null) {
-                throw Exception("Sitio protegido - Abra en WebView para desbloquear.")
+                val script = response.asJsoup().selectFirst("script")?.data()
+                if (script != null) {
+                    val a = script.split("(r)")[0].dropLast(1) + "r=r.replace('document.cookie','cookie');"
+                    QuickJs.create().use {
+                        val b = it.evaluate(a) as String
+                        val sucuriCookie = it.evaluate(b.replace("location.", "").replace("reload();", "")) as String
+                        val cookieName = sucuriCookie.split("=")[0]
+                        val cookieValue = sucuriCookie.split("=")[1].replace(";path", "")
+                        cookieManager.setCookie(url, "$cookieName=$cookieValue")
+                    }
+                    val newResponse = chain.proceed(request)
+                    if (!newResponse.headers["x-sucuri-cache"].isNullOrEmpty()) return@addInterceptor newResponse
+                }
+                throw IOException("Sitio protegido - Abra en WebView para intentar desbloquear.")
             }
             return@addInterceptor response
         }
+        .cookieJar(
+            object : CookieJar {
+                override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) =
+                    cookies.filter { it.matches(url) }.forEach {
+                        cookieManager.setCookie(url.toString(), it.toString())
+                    }
+
+                override fun loadForRequest(url: HttpUrl) =
+                    cookieManager.getCookie(url.toString())?.split("; ")
+                        ?.mapNotNull { Cookie.parse(url, it) } ?: emptyList()
+            },
+        )
         .build()
 
     override fun headersBuilder() = super.headersBuilder()
-        .set("Referer", "$baseUrl/")
+        .add("Referer", "$baseUrl/")
 
     override fun popularMangaRequest(page: Int): Request {
         val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder()
@@ -52,7 +86,7 @@ class ManhwasNet : ParsedHttpSource() {
     }
 
     override fun latestUpdatesRequest(page: Int): Request {
-        return GET("$baseUrl/esp")
+        return GET("$baseUrl/esp", headers)
     }
 
     override fun latestUpdatesSelector() = popularMangaSelector()
@@ -84,7 +118,7 @@ class ManhwasNet : ParsedHttpSource() {
             }
         }
         url.addQueryParameter("page", page.toString())
-        return GET(url.build().toString())
+        return GET(url.build().toString(), headers)
     }
 
     override fun searchMangaSelector() = popularMangaSelector()