From de1bcf35977cf624de1de54e95a515c60b37ab53 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 17 Sep 2023 13:17:53 -0600 Subject: [PATCH] Ladybird/Android: Enable content filters and Autoplay allowlist Copy these over from the standard main.cpp for WebContent. The ideas are already starting to come together on how to unify these main files. --- .../src/main/cpp/WebContentService.cpp | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/Ladybird/Android/src/main/cpp/WebContentService.cpp b/Ladybird/Android/src/main/cpp/WebContentService.cpp index 343ba1af08f..f90a7db2ba1 100644 --- a/Ladybird/Android/src/main/cpp/WebContentService.cpp +++ b/Ladybird/Android/src/main/cpp/WebContentService.cpp @@ -20,8 +20,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -42,6 +44,9 @@ static ErrorOr> bind_web_socket_service return bind_service(&bind_web_socket_java); } +static ErrorOr load_content_filters(); +static ErrorOr load_autoplay_allowlist(); + ErrorOr service_main(int ipc_socket, int fd_passing_socket) { Core::EventLoop event_loop; @@ -73,6 +78,14 @@ ErrorOr service_main(int ipc_socket, int fd_passing_socket) TRY(Web::Bindings::initialize_main_thread_vm()); + auto maybe_content_filter_error = load_content_filters(); + if (maybe_content_filter_error.is_error()) + dbgln("Failed to load content filters: {}", maybe_content_filter_error.error()); + + auto maybe_autoplay_allowlist_error = load_autoplay_allowlist(); + if (maybe_autoplay_allowlist_error.is_error()) + dbgln("Failed to load autoplay allowlist: {}", maybe_autoplay_allowlist_error.error()); + auto webcontent_socket = TRY(Core::LocalSocket::adopt_fd(ipc_socket)); auto webcontent_client = TRY(WebContent::ConnectionFromClient::try_create(move(webcontent_socket))); webcontent_client->set_fd_passing_socket(TRY(Core::LocalSocket::adopt_fd(fd_passing_socket))); @@ -106,3 +119,61 @@ static ErrorOr> bind_service(void (*bind_method)(int, int) return new_client; } + +static ErrorOr load_content_filters() +{ + auto file_or_error = Core::File::open(DeprecatedString::formatted("{}/home/anon/.config/BrowserContentFilters.txt", s_serenity_resource_root), Core::File::OpenMode::Read); + if (file_or_error.is_error()) + file_or_error = Core::File::open(DeprecatedString::formatted("{}/res/ladybird/BrowserContentFilters.txt", s_serenity_resource_root), Core::File::OpenMode::Read); + if (file_or_error.is_error()) + return file_or_error.release_error(); + + auto file = file_or_error.release_value(); + auto ad_filter_list = TRY(Core::InputBufferedFile::create(move(file))); + auto buffer = TRY(ByteBuffer::create_uninitialized(4096)); + + Vector patterns; + + while (TRY(ad_filter_list->can_read_line())) { + auto line = TRY(ad_filter_list->read_line(buffer)); + if (line.is_empty()) + continue; + + auto pattern = TRY(String::from_utf8(line)); + TRY(patterns.try_append(move(pattern))); + } + + auto& content_filter = Web::ContentFilter::the(); + TRY(content_filter.set_patterns(patterns)); + + return {}; +} + +static ErrorOr load_autoplay_allowlist() +{ + auto file_or_error = Core::File::open(TRY(String::formatted("{}/home/anon/.config/BrowserAutoplayAllowlist.txt", s_serenity_resource_root)), Core::File::OpenMode::Read); + if (file_or_error.is_error()) + file_or_error = Core::File::open(TRY(String::formatted("{}/res/ladybird/BrowserAutoplayAllowlist.txt", s_serenity_resource_root)), Core::File::OpenMode::Read); + if (file_or_error.is_error()) + return file_or_error.release_error(); + + auto file = file_or_error.release_value(); + auto allowlist = TRY(Core::InputBufferedFile::create(move(file))); + auto buffer = TRY(ByteBuffer::create_uninitialized(4096)); + + Vector origins; + + while (TRY(allowlist->can_read_line())) { + auto line = TRY(allowlist->read_line(buffer)); + if (line.is_empty()) + continue; + + auto domain = TRY(String::from_utf8(line)); + TRY(origins.try_append(move(domain))); + } + + auto& autoplay_allowlist = Web::PermissionsPolicy::AutoplayAllowlist::the(); + TRY(autoplay_allowlist.enable_for_origins(origins)); + + return {}; +}