diff options
author | Linus Groh <mail@linusgroh.de> | 2020-07-07 13:55:10 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-07 17:42:50 +0200 |
commit | 87465f7c541b33aa70c25d5fb0edb5e56269558c (patch) | |
tree | 2ce59207359e54d837b35139ee8990b7c88b5ab9 /Applications/Help/main.cpp | |
parent | 787673b743a9c976918b705745307a461d8eaa44 (diff) | |
download | serenity-87465f7c541b33aa70c25d5fb0edb5e56269558c.zip |
Help: Handle external links
Links which do not have the "file" protocol (most commonly links to
external websites - http and https) are now not treated as file paths
anymore but instead handled by Desktop::Launcher.
The same applies to files outside of /usr/share/man.
Fixes #2727.
Diffstat (limited to 'Applications/Help/main.cpp')
-rw-r--r-- | Applications/Help/main.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/Applications/Help/main.cpp b/Applications/Help/main.cpp index 105584915d..145fdd0acf 100644 --- a/Applications/Help/main.cpp +++ b/Applications/Help/main.cpp @@ -29,6 +29,7 @@ #include <AK/ByteBuffer.h> #include <AK/URL.h> #include <LibCore/File.h> +#include <LibDesktop/Launcher.h> #include <LibGUI/AboutDialog.h> #include <LibGUI/Action.h> #include <LibGUI/Application.h> @@ -58,7 +59,7 @@ int main(int argc, char* argv[]) auto app = GUI::Application::construct(argc, argv); - if (pledge("stdio shared_buffer accept rpath", nullptr) < 0) { + if (pledge("stdio shared_buffer accept rpath unix", nullptr) < 0) { perror("pledge"); return 1; } @@ -73,6 +74,11 @@ int main(int argc, char* argv[]) return 1; } + if (unveil("/tmp/portal/launch", "rw") < 0) { + perror("unveil"); + return 1; + } + unveil(nullptr, nullptr); auto app_icon = GUI::Icon::default_icon("app-help"); @@ -159,10 +165,27 @@ int main(int argc, char* argv[]) model->update_section_node_on_toggle(index, open); }; + auto open_external = [&](auto& url) { + if (!Desktop::Launcher::open(url)) { + GUI::MessageBox::show( + String::format("The link to '%s' could not be opened.", url.to_string().characters()), + "Failed to open link", + GUI::MessageBox::Type::Error, + GUI::MessageBox::InputType::OK, + window); + } + }; + page_view.on_link_click = [&](auto& url, auto&, unsigned) { - char* current_path = strdup(history.current().characters()); - char* path = realpath(url.path().characters(), nullptr); - free(current_path); + if (url.protocol() != "file") { + open_external(url); + return; + } + auto path = Core::File::real_path_for(url.path()); + if (!path.starts_with("/usr/share/man/")) { + open_external(url); + return; + } auto tree_view_index = model->index_from_path(path); if (tree_view_index.has_value()) { dbg() << "Found path _" << path << "_ in model at index " << tree_view_index.value(); @@ -172,7 +195,6 @@ int main(int argc, char* argv[]) history.push(path); update_actions(); open_page(path); - free(path); }; go_back_action = GUI::CommonActions::make_go_back_action([&](auto&) { |