mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 04:32:44 +00: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
					
				
					 5 changed files with 43 additions and 4 deletions
				
			
		|  | @ -22,6 +22,23 @@ Client& Client::the() | ||||||
|     return *s_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) | Result Client::request_file(i32 parent_window_id, String const& path, Core::OpenMode mode) | ||||||
| { | { | ||||||
|     m_promise = Core::Promise<Result>::construct(); |     m_promise = Core::Promise<Result>::construct(); | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ class Client final | ||||||
|     C_OBJECT(Client) |     C_OBJECT(Client) | ||||||
| 
 | 
 | ||||||
| public: | 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 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 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); |     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; |     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)); |     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 main_window = create_dummy_child_window(window_server_client_id, parent_window_id); | ||||||
| 
 | 
 | ||||||
|  |         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); |             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; |             approved = result == GUI::MessageBox::ExecYes; | ||||||
|  |         } else { | ||||||
|  |             approved = true; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         if (approved) { |         if (approved) { | ||||||
|             auto new_permissions = relevant_permissions; |             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) | 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); |     auto relevant_permissions = requested_access & (Core::OpenMode::ReadOnly | Core::OpenMode::WriteOnly); | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ public: | ||||||
|     virtual void die() override; |     virtual void die() override; | ||||||
| 
 | 
 | ||||||
| private: | 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 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_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; |     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&); |     void prompt_helper(Optional<String> const&, Core::OpenMode const&); | ||||||
|     RefPtr<GUI::Window> create_dummy_child_window(i32, i32); |     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; |     virtual Messages::FileSystemAccessServer::ExposeWindowServerClientIdResponse expose_window_server_client_id() override; | ||||||
| 
 | 
 | ||||||
|     HashMap<String, Core::OpenMode> m_approved_files; |     HashMap<String, Core::OpenMode> m_approved_files; | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| 
 | 
 | ||||||
| endpoint FileSystemAccessServer | 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) =| |     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_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) =| |     prompt_save_file(i32 window_server_client_id, i32 window_id,String title, String ext, String path_to_view, Core::OpenMode requested_access) =| | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mustafa Quraish
						Mustafa Quraish