From 99835dfc170de97f57f4fbf1f1cdce236613a5d3 Mon Sep 17 00:00:00 2001
From: Xwite <1797350009@qq.com>
Date: Wed, 1 Jun 2022 17:25:15 +0800
Subject: [PATCH 1/4] fix(epub): reset ReadConfig.useReplaceRule to false
fix #1831
---
 app/src/main/java/io/legado/app/data/entities/Book.kt       | 3 ++-
 app/src/main/java/io/legado/app/model/localBook/EpubFile.kt | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt
index 449d6eacc..d5ff08514 100644
--- a/app/src/main/java/io/legado/app/data/entities/Book.kt
+++ b/app/src/main/java/io/legado/app/data/entities/Book.kt
@@ -202,7 +202,8 @@ data class Book(
         if (useReplaceRule != null) {
             return useReplaceRule
         }
-        if (type == BookType.image) {
+        //图片类书源 epub本地 默认关闭净化
+        if (type == BookType.image || isEpub()) {
             return false
         }
         return AppConfig.replaceEnableDefault
diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt
index 5d4d36e96..b12e0726e 100644
--- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt
+++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt
@@ -33,7 +33,7 @@ class EpubFile(var book: Book) {
             if (eFile == null || eFile?.book?.bookUrl != book.bookUrl) {
                 eFile = EpubFile(book)
                 //对于Epub文件默认不启用替换
-                book.setUseReplaceRule(false)
+                //io.legado.app.data.entities.Book getUseReplaceRule
                 return eFile!!
             }
             eFile?.book = book
From 2f4f7f46b74c763d9f1a2405121da2151fa66767 Mon Sep 17 00:00:00 2001
From: Xwite <1797350009@qq.com>
Date: Wed, 1 Jun 2022 17:43:03 +0800
Subject: [PATCH 2/4] feat(ImageProvider): toast when image url is empty
---
 .../app/ui/book/read/page/provider/ImageProvider.kt      | 9 ++++++---
 app/src/main/res/values-es-rES/strings.xml               | 2 ++
 app/src/main/res/values-ja-rJP/strings.xml               | 2 ++
 app/src/main/res/values-pt-rBR/strings.xml               | 2 ++
 app/src/main/res/values-zh-rHK/strings.xml               | 2 ++
 app/src/main/res/values-zh-rTW/strings.xml               | 2 ++
 app/src/main/res/values-zh/strings.xml                   | 2 ++
 app/src/main/res/values/strings.xml                      | 2 ++
 8 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
index 549372c51..bf9954da3 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
@@ -13,8 +13,7 @@ import io.legado.app.help.BookHelp
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.model.localBook.EpubFile
-import io.legado.app.utils.BitmapUtils
-import io.legado.app.utils.FileUtils
+import io.legado.app.utils.*
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.withContext
 import splitties.init.appCtx
@@ -113,6 +112,10 @@ object ImageProvider {
         width: Int,
         height: Int? = null
     ): Bitmap {
+        //src为空白时 可能被净化替换掉了 或者规则失效
+        if (book.getUseReplaceRule() && src.isBlank()) {
+           appCtx.toastOnUi(R.string.error_image_url_empty)
+        }
         val vFile = BookHelp.getImage(book, src)
         if (!vFile.exists()) return errorBitmap
         //epub文件提供图片链接是相对链接,同时阅读多个epub文件,缓存命中错误
@@ -122,7 +125,7 @@ object ImageProvider {
         @Suppress("BlockingMethodInNonBlockingContext")
         return kotlin.runCatching {
             val bitmap = BitmapUtils.decodeBitmap(vFile.absolutePath, width, height)
-                ?: throw NoStackTraceException("解析图片失败")
+                ?: throw NoStackTraceException(appCtx.getString(R.string.error_decode_bitmap))
             bitmapLruCache.put(vFile.absolutePath, bitmap)
             bitmap
         }.onFailure {
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 6e95b867d..5827eba82 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -993,4 +993,6 @@
     bitmap cache size
     Export Picture Files
     
+    Fail to decode bitmap
+    Image url is empty, check replacement rules
 
diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml
index aad299b97..88570cfdc 100644
--- a/app/src/main/res/values-ja-rJP/strings.xml
+++ b/app/src/main/res/values-ja-rJP/strings.xml
@@ -996,4 +996,6 @@
     bitmap cache size
     Export Picture Files
     
+    Fail to decode bitmap
+    Image url is empty, check replacement rules
 
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 6aa240a76..ee55c893a 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -996,4 +996,6 @@
     bitmap cache size
     Export Picture Files
     
+    Fail to decode bitmap
+    Image url is empty, check replacement rules
 
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 32b479fb6..22c20f729 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -993,4 +993,6 @@
     图片绘制缓存
     TXT导出图片
     
+    图片解码失败
+    图片链接为空,检查替换净化规则
 
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index bb8b1d278..963cff29e 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -995,4 +995,6 @@
     圖片繪製快取
     TXT匯出圖片
     
+    图片解码失败
+    图片链接为空,检查替换净化规则
 
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 216791d7e..a4727df79 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -995,4 +995,6 @@
     图片绘制缓存
     TXT导出图片
     
+    图片解码失败
+    图片链接为空,检查替换净化规则
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f94211986..d6905d954 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -996,4 +996,6 @@
     bitmap cache size
     Export Picture Files
     
+    Fail to decode bitmap
+    Image url is empty, check replacement rules
 
From 6098260f4533f1e22b1e217292c15660befa3508 Mon Sep 17 00:00:00 2001
From: Xwite <1797350009@qq.com>
Date: Wed, 1 Jun 2022 18:27:34 +0800
Subject: [PATCH 3/4] feat(ImageProvider): disable replace when detect empty
 image url
---
 .../io/legado/app/ui/book/read/page/provider/ImageProvider.kt    | 1 +
 1 file changed, 1 insertion(+)
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
index bf9954da3..19dd436f0 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
@@ -114,6 +114,7 @@ object ImageProvider {
     ): Bitmap {
         //src为空白时 可能被净化替换掉了 或者规则失效
         if (book.getUseReplaceRule() && src.isBlank()) {
+           book.setUseReplaceRule(false)
            appCtx.toastOnUi(R.string.error_image_url_empty)
         }
         val vFile = BookHelp.getImage(book, src)
From 23d26172a4128e92e778708a480231f162e642d8 Mon Sep 17 00:00:00 2001
From: Xwite <1797350009@qq.com>
Date: Wed, 1 Jun 2022 19:47:39 +0800
Subject: [PATCH 4/4] fix: check suffix characters
---
 app/src/main/java/io/legado/app/help/BookHelp.kt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt
index 7e68c778c..0d607a5f1 100644
--- a/app/src/main/java/io/legado/app/help/BookHelp.kt
+++ b/app/src/main/java/io/legado/app/help/BookHelp.kt
@@ -144,7 +144,9 @@ object BookHelp {
 
     fun getImageSuffix(src: String): String {
         var suffix = src.substringAfterLast(".").substringBefore(",")
-        if (suffix.length > 5) {
+        //检查截取的后缀字符是否合法 [a-zA-Z0-9]
+        val fileSuffixRegex = Regex("^[a-z0-9]+$", RegexOption.IGNORE_CASE)
+        if (suffix.length > 5 || !suffix.matches(fileSuffixRegex)) {
             suffix = "jpg"
         }
         return suffix