From f26a898ffc027a8885cfb32946089a8d6c392c00 Mon Sep 17 00:00:00 2001 From: Olekoop Date: Thu, 10 Jul 2025 12:31:21 +0200 Subject: [PATCH] Android: Workaround the system certificate issue Due to removal of local ca-certificates we need to use system's certificate. However, on Android it is stored in multiple files. Ladybird doesn't support multiple certificates yet, so we just concatenate all of them into one big file. --- Services/RequestServer/CMakeLists.txt | 4 ++++ .../src/main/cpp/RequestServerService.cpp | 2 +- .../serenityos/ladybird/LadybirdActivity.kt | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Services/RequestServer/CMakeLists.txt b/Services/RequestServer/CMakeLists.txt index b65c42f5101..59d862fed7d 100644 --- a/Services/RequestServer/CMakeLists.txt +++ b/Services/RequestServer/CMakeLists.txt @@ -44,3 +44,7 @@ if (HAIKU) # Haiku has networking related functions in the network library target_link_libraries(RequestServer PRIVATE network) endif() +if (ANDROID) + # We need s_ladybird_resource_root from LibWebView + target_link_libraries(requestserverservice PUBLIC LibWebView) +endif() diff --git a/UI/Android/src/main/cpp/RequestServerService.cpp b/UI/Android/src/main/cpp/RequestServerService.cpp index ed036ad07ac..7cbcf1c466b 100644 --- a/UI/Android/src/main/cpp/RequestServerService.cpp +++ b/UI/Android/src/main/cpp/RequestServerService.cpp @@ -27,7 +27,7 @@ extern ByteString g_default_certificate_path; ErrorOr service_main(int ipc_socket) { - RequestServer::g_default_certificate_path = ByteString::formatted("{}/res/ladybird/cacert.pem", WebView::s_ladybird_resource_root); + RequestServer::g_default_certificate_path = ByteString::formatted("{}/cacert.pem", WebView::s_ladybird_resource_root); Core::EventLoop event_loop; diff --git a/UI/Android/src/main/java/org/serenityos/ladybird/LadybirdActivity.kt b/UI/Android/src/main/java/org/serenityos/ladybird/LadybirdActivity.kt index 1286be37a74..48892475b86 100644 --- a/UI/Android/src/main/java/org/serenityos/ladybird/LadybirdActivity.kt +++ b/UI/Android/src/main/java/org/serenityos/ladybird/LadybirdActivity.kt @@ -17,7 +17,12 @@ import java.io.BufferedInputStream import java.io.BufferedOutputStream import java.io.File import java.io.FileOutputStream +import java.nio.file.Files import java.util.zip.ZipFile +import kotlin.io.path.Path +import kotlin.io.path.inputStream +import kotlin.io.path.isDirectory +import kotlin.io.path.outputStream class LadybirdActivity : AppCompatActivity() { @@ -51,6 +56,19 @@ class LadybirdActivity : AppCompatActivity() { } } } + + // curl has some issues with the Android's way of storing certificates. + // We need to do this in order to make curl happy. + val certMain = File("$resourceDir/cacert.pem") + certMain.outputStream().use { output -> + Files.walk(Path("/system/etc/security/cacerts")).forEach { certPath -> + if (!certPath.isDirectory()) { + certPath.inputStream().use { input -> + input.copyTo(output) + } + } + } + } } val userDir = applicationContext.getExternalFilesDir(null)!!.absolutePath; initNativeCode(resourceDir, "Ladybird", timerService, userDir)