mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-07 19:57:45 +03:00
FileSystemAccessServer: Allow read-only access without prompting
This commit adds a new request to the FileSystemAccessServer endpoint, allowing the clients to get read-only access to a file without getting a Dialog-box prompting the user for access. This is only meant to be used in cases where the user has asked specifically to open a file through the command-line arguments. In those cases, I believe it makes sense for the read-only access to be implicit. Always prompting the user gets a bit annoying, especially if you just quickly want to open a file through the CLI. The new request name has been made extremely specific to make sure that it's only used when appropriate.
This commit is contained in:
parent
b37211a615
commit
2a968e92f0
Notes:
sideshowbarker
2024-07-18 04:20:18 +09:00
Author: https://github.com/mustafaquraish Commit: https://github.com/SerenityOS/serenity/commit/2a968e92f07 Pull-request: https://github.com/SerenityOS/serenity/pull/9854 Reviewed-by: https://github.com/IdanHo Reviewed-by: https://github.com/alimpfard
@ -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<Result>::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<Result>::construct();
|
||||
|
@ -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);
|
||||
|
@ -49,7 +49,7 @@ RefPtr<GUI::Window> 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);
|
||||
|
@ -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<String> const&, Core::OpenMode const&);
|
||||
RefPtr<GUI::Window> 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<String, Core::OpenMode> m_approved_files;
|
||||
|
@ -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) =|
|
||||
|
Loading…
Reference in New Issue
Block a user