소스 검색

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.
Mustafa Quraish 3 년 전
부모
커밋
2a968e92f0

+ 17 - 0
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<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();

+ 1 - 0
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);

+ 17 - 4
Userland/Services/FileSystemAccessServer/ClientConnection.cpp

@@ -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);

+ 7 - 0
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<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;

+ 1 - 0
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) =|