Inspector: Check if RemoteProcess is_inspectable

The previous check of looking at `/proc/PID` was not working, it would
always fail even if the process was indeed inspectable.

Commit 70117781 introduced a new IPC for asking InspectorServer whether
or not a given `pid` is actually inspectable.

If a process is not inspectable, the `GUI::ProcessChooser` is
redisplayed if it was previously displayed, otherwise it exits.
This commit is contained in:
Matthew Jones 2021-06-01 10:35:57 -06:00 committed by Andreas Kling
parent 00c8b74ab4
commit fe026fef47
Notes: sideshowbarker 2024-07-18 17:01:31 +09:00
3 changed files with 25 additions and 13 deletions

View file

@ -88,6 +88,11 @@ void RemoteProcess::set_property(FlatPtr object, const StringView& name, const J
m_client->async_set_object_property(m_pid, object, name, value.to_string());
}
bool RemoteProcess::is_inspectable()
{
return m_client->is_inspectable(m_pid);
}
void RemoteProcess::update()
{
{

View file

@ -32,6 +32,8 @@ public:
void set_property(FlatPtr object, const StringView& name, const JsonValue& value);
bool is_inspectable();
Function<void()> on_update;
private:

View file

@ -66,11 +66,13 @@ int main(int argc, char** argv)
unveil(nullptr, nullptr);
bool gui_mode = argc != 2;
pid_t pid;
auto app = GUI::Application::construct(argc, argv);
auto app_icon = GUI::Icon::default_icon("app-inspector");
if (argc != 2) {
if (gui_mode) {
choose_pid:
auto process_chooser = GUI::ProcessChooser::construct("Inspector", "Inspect", app_icon.bitmap_for_size(16));
if (process_chooser->exec() == GUI::Dialog::ExecCancel)
return 0;
@ -84,21 +86,26 @@ int main(int argc, char** argv)
auto window = GUI::Window::construct();
if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls(
"/bin/Help",
{ URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") })
|| !Desktop::Launcher::seal_allowlist()) {
warnln("Failed to set up allowed launch URLs");
return 1;
}
if (pid == getpid()) {
GUI::MessageBox::show(window, "Cannot inspect Inspector itself!", "Error", GUI::MessageBox::Type::Error);
return 1;
}
if (access(String::formatted("/proc/{}", pid).characters(), R_OK) == -1) {
GUI::MessageBox::show(window, "Inspector doesn't have permission to access the process.", "Error", GUI::MessageBox::Type::Error);
RemoteProcess remote_process(pid);
if (!remote_process.is_inspectable()) {
GUI::MessageBox::show(window, String::formatted("Process pid={} is not inspectable", remote_process.pid()), "Error", GUI::MessageBox::Type::Error);
if (gui_mode) {
goto choose_pid;
} else {
return 1;
}
}
if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls(
"/bin/Help",
{ URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") })
|| !Desktop::Launcher::seal_allowlist()) {
warnln("Failed to set up allowed launch URLs");
return 1;
}
@ -123,8 +130,6 @@ int main(int argc, char** argv)
auto& splitter = widget.add<GUI::HorizontalSplitter>();
RemoteProcess remote_process(pid);
remote_process.on_update = [&] {
if (!remote_process.process_name().is_null())
window->set_title(String::formatted("{} ({}) - Inspector", remote_process.process_name(), remote_process.pid()));