diff --git a/Userland/Libraries/LibFileSystemAccessClient/Client.cpp b/Userland/Libraries/LibFileSystemAccessClient/Client.cpp index a18b2ed3576..227fd1e66df 100644 --- a/Userland/Libraries/LibFileSystemAccessClient/Client.cpp +++ b/Userland/Libraries/LibFileSystemAccessClient/Client.cpp @@ -22,6 +22,23 @@ Client& Client::the() return *s_the; } +Result Client::request_file_read_only_approved(i32 parent_window_id, String const& path) +{ + m_promise = Core::Promise::construct(); + auto parent_window_server_client_id = GUI::WindowServerConnection::the().expose_client_id(); + auto child_window_server_client_id = expose_window_server_client_id(); + + GUI::WindowServerConnection::the().async_add_window_stealing_for_client(child_window_server_client_id, parent_window_id); + + ScopeGuard guard([parent_window_id, child_window_server_client_id] { + GUI::WindowServerConnection::the().async_remove_window_stealing_for_client(child_window_server_client_id, parent_window_id); + }); + + async_request_file_read_only_approved(parent_window_server_client_id, parent_window_id, path); + + return m_promise->await(); +} + Result Client::request_file(i32 parent_window_id, String const& path, Core::OpenMode mode) { m_promise = Core::Promise::construct(); diff --git a/Userland/Libraries/LibFileSystemAccessClient/Client.h b/Userland/Libraries/LibFileSystemAccessClient/Client.h index b2b418fd544..4396d603928 100644 --- a/Userland/Libraries/LibFileSystemAccessClient/Client.h +++ b/Userland/Libraries/LibFileSystemAccessClient/Client.h @@ -27,6 +27,7 @@ class Client final C_OBJECT(Client) public: + Result request_file_read_only_approved(i32 parent_window_id, String const& path); Result request_file(i32 parent_window_id, String const& path, Core::OpenMode mode); Result open_file(i32 parent_window_id, String const& window_title = {}, StringView const& path = Core::StandardPaths::home_directory()); Result save_file(i32 parent_window_id, String const& name, String const ext); diff --git a/Userland/Services/FileSystemAccessServer/ClientConnection.cpp b/Userland/Services/FileSystemAccessServer/ClientConnection.cpp index 4e901bc3ef3..26fef1c65b1 100644 --- a/Userland/Services/FileSystemAccessServer/ClientConnection.cpp +++ b/Userland/Services/FileSystemAccessServer/ClientConnection.cpp @@ -49,7 +49,7 @@ RefPtr ClientConnection::create_dummy_child_window(i32 window_serve return window; } -void ClientConnection::request_file(i32 window_server_client_id, i32 parent_window_id, String const& path, Core::OpenMode const& requested_access) +void ClientConnection::request_file_handler(i32 window_server_client_id, i32 parent_window_id, String const& path, Core::OpenMode const& requested_access, ShouldPrompt prompt) { VERIFY(path.starts_with("/"sv)); @@ -79,9 +79,12 @@ void ClientConnection::request_file(i32 window_server_client_id, i32 parent_wind auto main_window = create_dummy_child_window(window_server_client_id, parent_window_id); - auto result = GUI::MessageBox::show(main_window, String::formatted("Allow {} ({}) to {} \"{}\"?", exe_name, pid, access_string, path), "File Permissions Requested", GUI::MessageBox::Type::Warning, GUI::MessageBox::InputType::YesNo); - - approved = result == GUI::MessageBox::ExecYes; + if (prompt == ShouldPrompt::Yes) { + auto result = GUI::MessageBox::show(main_window, String::formatted("Allow {} ({}) to {} \"{}\"?", exe_name, pid, access_string, path), "File Permissions Requested", GUI::MessageBox::Type::Warning, GUI::MessageBox::InputType::YesNo); + approved = result == GUI::MessageBox::ExecYes; + } else { + approved = true; + } if (approved) { auto new_permissions = relevant_permissions; @@ -107,6 +110,16 @@ void ClientConnection::request_file(i32 window_server_client_id, i32 parent_wind } } +void ClientConnection::request_file_read_only_approved(i32 window_server_client_id, i32 parent_window_id, String const& path) +{ + request_file_handler(window_server_client_id, parent_window_id, path, Core::OpenMode::ReadOnly, ShouldPrompt::No); +} + +void ClientConnection::request_file(i32 window_server_client_id, i32 parent_window_id, String const& path, Core::OpenMode const& requested_access) +{ + request_file_handler(window_server_client_id, parent_window_id, path, requested_access, ShouldPrompt::Yes); +} + void ClientConnection::prompt_open_file(i32 window_server_client_id, i32 parent_window_id, String const& window_title, String const& path_to_view, Core::OpenMode const& requested_access) { auto relevant_permissions = requested_access & (Core::OpenMode::ReadOnly | Core::OpenMode::WriteOnly); diff --git a/Userland/Services/FileSystemAccessServer/ClientConnection.h b/Userland/Services/FileSystemAccessServer/ClientConnection.h index 2b24559de45..fb3ecc10252 100644 --- a/Userland/Services/FileSystemAccessServer/ClientConnection.h +++ b/Userland/Services/FileSystemAccessServer/ClientConnection.h @@ -26,6 +26,7 @@ public: virtual void die() override; private: + virtual void request_file_read_only_approved(i32, i32, String const&) override; virtual void request_file(i32, i32, String const&, Core::OpenMode const&) override; virtual void prompt_open_file(i32, i32, String const&, String const&, Core::OpenMode const&) override; virtual void prompt_save_file(i32, i32, String const&, String const&, String const&, Core::OpenMode const&) override; @@ -33,6 +34,12 @@ private: void prompt_helper(Optional const&, Core::OpenMode const&); RefPtr create_dummy_child_window(i32, i32); + enum class ShouldPrompt { + No, + Yes + }; + void request_file_handler(i32, i32, String const&, Core::OpenMode const&, ShouldPrompt); + virtual Messages::FileSystemAccessServer::ExposeWindowServerClientIdResponse expose_window_server_client_id() override; HashMap m_approved_files; diff --git a/Userland/Services/FileSystemAccessServer/FileSystemAccessServer.ipc b/Userland/Services/FileSystemAccessServer/FileSystemAccessServer.ipc index 9976018907e..117260a7f75 100644 --- a/Userland/Services/FileSystemAccessServer/FileSystemAccessServer.ipc +++ b/Userland/Services/FileSystemAccessServer/FileSystemAccessServer.ipc @@ -3,6 +3,7 @@ endpoint FileSystemAccessServer { + request_file_read_only_approved(i32 window_server_client_id, i32 window_id, String path) =| request_file(i32 window_server_client_id, i32 window_id, String path, Core::OpenMode requested_access) =| prompt_open_file(i32 window_server_client_id, i32 window_id, String window_title, String path_to_view, Core::OpenMode requested_access) =| prompt_save_file(i32 window_server_client_id, i32 window_id,String title, String ext, String path_to_view, Core::OpenMode requested_access) =|