From 22745b5b8a74d5b9ddcd2b9064097d599f859fe9 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 25 Jun 2024 22:16:34 +0800 Subject: [PATCH] Fix base64 --- .../java/com/fongmi/android/tv/bean/Drm.java | 2 +- .../com/fongmi/android/tv/bean/Parse.java | 3 +-- .../android/tv/model/SiteViewModel.java | 2 +- .../com/fongmi/android/tv/server/Nano.java | 2 +- .../java/com/github/catvod/utils/Util.java | 19 ++++++++++++------- .../java/com/fongmi/quickjs/bean/Res.java | 4 ++-- .../com/fongmi/quickjs/crawler/Spider.java | 4 ++-- .../java/com/fongmi/quickjs/utils/Crypto.java | 4 ++-- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java index 01f530d9a..58f847c66 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java @@ -44,7 +44,7 @@ public class Drm { private String getUri() { if (getKey().startsWith("http")) return getKey(); - return Server.get().getAddress("license/") + Util.base64(getKey()); + return Server.get().getAddress("license/") + Util.base64(getKey(), Util.URL_SAFE); } public MediaItem.DrmConfiguration get() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index 07b424aa0..10fa7757c 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.bean; import android.text.TextUtils; -import android.util.Base64; import androidx.annotation.NonNull; @@ -128,7 +127,7 @@ public class Parse { public String extUrl() { int index = getUrl().indexOf("?"); if (getExt().isEmpty() || index == -1) return getUrl(); - return getUrl().substring(0, index + 1) + "cat_ext=" + Util.base64(getExt().toString(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + "&" + getUrl().substring(index + 1); + return getUrl().substring(0, index + 1) + "cat_ext=" + Util.base64(getExt().toString(), Util.URL_SAFE) + "&" + getUrl().substring(index + 1); } public HashMap mixMap() { diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 81b7b0935..bd196cec6 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -102,7 +102,7 @@ public class SiteViewModel extends ViewModel { } else { ArrayMap params = new ArrayMap<>(); if (site.getType() == 1 && !extend.isEmpty()) params.put("f", App.gson().toJson(extend)); - else if (site.getType() == 4) params.put("ext", Util.base64(App.gson().toJson(extend))); + if (site.getType() == 4) params.put("ext", Util.base64(App.gson().toJson(extend), Util.URL_SAFE)); params.put("ac", site.getType() == 0 ? "videolist" : "detail"); params.put("t", tid); params.put("pg", page); diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index 444fef31e..44b3e8b4a 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -61,7 +61,7 @@ public class Nano extends NanoHTTPD { if (url.startsWith("/proxy")) return proxy(session); if (url.startsWith("/tvbus")) return success(LiveConfig.getResp()); if (url.startsWith("/device")) return success(Device.get().toString()); - if (url.startsWith("/license")) return success(Util.decode(url.substring(9))); + if (url.startsWith("/license")) return success(new String(Util.decode(url.substring(9), Util.URL_SAFE))); for (Process process : process) if (process.isRequest(session, url)) return process.doResponse(session, url, files); return getAssets(url.substring(1)); } diff --git a/catvod/src/main/java/com/github/catvod/utils/Util.java b/catvod/src/main/java/com/github/catvod/utils/Util.java index 260794c3b..a72c301fc 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Util.java +++ b/catvod/src/main/java/com/github/catvod/utils/Util.java @@ -25,25 +25,30 @@ import java.util.Enumeration; public class Util { public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"; + public static final int URL_SAFE = Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP; public static String base64(String s) { - return base64(s, Base64.URL_SAFE | Base64.NO_PADDING); + return base64(s.getBytes()); } - public static String base64(String s, int flags) { - return base64(s.getBytes(), flags); + public static String base64(byte[] bytes) { + return base64(bytes, Base64.DEFAULT | Base64.NO_WRAP); } - public static String base64(byte[] bytes) { - return base64(bytes, Base64.DEFAULT); + public static String base64(String s, int flags) { + return base64(s.getBytes(), flags); } public static String base64(byte[] bytes, int flags) { return Base64.encodeToString(bytes, flags); } - public static String decode(String s) { - return new String(Base64.decode(s, Base64.URL_SAFE | Base64.NO_PADDING)); + public static byte[] decode(String s) { + return decode(s, Base64.DEFAULT | Base64.NO_WRAP); + } + + public static byte[] decode(String s, int flags) { + return Base64.decode(s, flags); } public static String basic(String userInfo) { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/bean/Res.java b/quickjs/src/main/java/com/fongmi/quickjs/bean/Res.java index cec5aaf76..57d2f0406 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/bean/Res.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/bean/Res.java @@ -1,9 +1,9 @@ package com.fongmi.quickjs.bean; import android.text.TextUtils; -import android.util.Base64; import com.github.catvod.utils.Json; +import com.github.catvod.utils.Util; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; @@ -57,7 +57,7 @@ public class Res { } public ByteArrayInputStream getStream() { - if (getBuffer() == 2) return new ByteArrayInputStream(Base64.decode(getContent(), Base64.DEFAULT)); + if (getBuffer() == 2) return new ByteArrayInputStream(Util.decode(getContent())); return new ByteArrayInputStream(getContent().getBytes()); } } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index e14602a04..ad4d4f651 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -1,7 +1,6 @@ package com.fongmi.quickjs.crawler; import android.content.Context; -import android.util.Base64; import androidx.media3.common.util.UriUtil; @@ -14,6 +13,7 @@ import com.fongmi.quickjs.utils.JSUtil; import com.fongmi.quickjs.utils.Module; import com.github.catvod.utils.Asset; import com.github.catvod.utils.Json; +import com.github.catvod.utils.Util; import com.whl.quickjs.wrapper.JSArray; import com.whl.quickjs.wrapper.JSMethod; import com.whl.quickjs.wrapper.JSObject; @@ -260,7 +260,7 @@ public class Spider extends com.github.catvod.crawler.Spider { } else { String content = o.toString(); if (base64 && content.contains("base64,")) content = content.split("base64,")[1]; - return new ByteArrayInputStream(base64 ? Base64.decode(content, Base64.DEFAULT) : content.getBytes()); + return new ByteArrayInputStream(base64 ? Util.decode(content) : content.getBytes()); } } } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java index 44357c97d..22d4b628b 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java @@ -38,7 +38,7 @@ public class Crypto { SecretKeySpec keySpec = new SecretKeySpec(keyBuf, "AES"); if (iv == null) cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec); else cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(ivBuf)); - byte[] inBuf = inBase64 ? Base64.decode(input.replaceAll("_", "/").replaceAll("-", "+"), Base64.DEFAULT) : input.getBytes("UTF-8"); + byte[] inBuf = inBase64 ? Base64.decode(input, Base64.DEFAULT | Base64.URL_SAFE) : input.getBytes("UTF-8"); return outBase64 ? Base64.encodeToString(cipher.doFinal(inBuf), Base64.NO_WRAP) : new String(cipher.doFinal(inBuf), "UTF-8"); } catch (Exception e) { e.printStackTrace(); @@ -51,7 +51,7 @@ public class Crypto { Key rsaKey = generateKey(pub, key); int len = getModulusLength(rsaKey); byte[] outBytes = new byte[0]; - byte[] inBytes = inBase64 ? Base64.decode(input.replaceAll("_", "/").replaceAll("-", "+"), Base64.DEFAULT) : input.getBytes("UTF-8"); + byte[] inBytes = inBase64 ? Base64.decode(input, Base64.DEFAULT | Base64.URL_SAFE) : input.getBytes("UTF-8"); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, rsaKey); int blockLen = encrypt ? len / 8 - 11 : len / 8;