From a156b52ddd8cd94c8ea851bea82433f43692e269 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 4 Apr 2023 23:24:18 +0300 Subject: [PATCH] mu: allow relative message paths in mu commands --- lib/message/mu-message.cc | 8 +++++--- lib/message/mu-message.hh | 10 ++++++---- mu/mu-cmd.cc | 7 +------ mu/mu-cmd.hh | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/message/mu-message.cc b/lib/message/mu-message.cc index f81b01fe..cdc08d61 100644 --- a/lib/message/mu-message.cc +++ b/lib/message/mu-message.cc @@ -73,11 +73,13 @@ struct Message::Private { static void fill_document(Message::Private& priv); static Result -get_statbuf(const std::string& path) +get_statbuf(const std::string& path, Message::Options opts = Message::Options::None) { - if (!g_path_is_absolute(path.c_str())) + if (none_of(opts & Message::Options::AllowRelativePath) && + !g_path_is_absolute(path.c_str())) return Err(Error::Code::File, "path '%s' is not absolute", path.c_str()); + if (::access(path.c_str(), R_OK) != 0) return Err(Error::Code::File, "file @ '%s' is not readable", path.c_str()); @@ -97,7 +99,7 @@ get_statbuf(const std::string& path) Message::Message(const std::string& path, Message::Options opts): priv_{std::make_unique(opts)} { - const auto statbuf{get_statbuf(path)}; + const auto statbuf{get_statbuf(path, opts)}; if (!statbuf) throw statbuf.error(); diff --git a/lib/message/mu-message.hh b/lib/message/mu-message.hh index 615b5d8c..893b0a87 100644 --- a/lib/message/mu-message.hh +++ b/lib/message/mu-message.hh @@ -45,10 +45,12 @@ namespace Mu { class Message { public: enum struct Options { - None = 0, /**< Defaults */ - Decrypt = 1 << 0, /**< Attempt to decrypt */ - RetrieveKeys = 1 << 1, /**< Auto-retrieve crypto keys (implies network - * access) */ + None = 0, /**< Defaults */ + Decrypt = 1 << 0, /**< Attempt to decrypt */ + RetrieveKeys = 1 << 1, /**< Auto-retrieve crypto keys (implies network + * access) */ + AllowRelativePath = 1 << 2, /**< Allow relateive paths for filename + * in make_from_path */ }; /** diff --git a/mu/mu-cmd.cc b/mu/mu-cmd.cc index 0f4af1a7..3f8a7c9c 100644 --- a/mu/mu-cmd.cc +++ b/mu/mu-cmd.cc @@ -156,12 +156,7 @@ handle_msg(const std::string& fname, const Options& opts) { using Format = Options::View::Format; - // make absolute. - const auto fpath{to_string_opt_gchar(g_canonicalize_filename(fname.c_str(), NULL))}; - if (!fpath) - return Err(Error::Code::File, "invalid file '%s'", fname.c_str()); - - auto message{Message::make_from_path(*fpath, message_options(opts.view))}; + auto message{Message::make_from_path(fname, message_options(opts.view))}; if (!message) return Err(message.error()); diff --git a/mu/mu-cmd.hh b/mu/mu-cmd.hh index 3fc57c77..e98d3c71 100644 --- a/mu/mu-cmd.hh +++ b/mu/mu-cmd.hh @@ -40,7 +40,7 @@ template constexpr Message::Options message_options(const CmdOpts& cmdopts) { - Message::Options mopts{}; + Message::Options mopts{Message::Options::AllowRelativePath}; if (cmdopts.decrypt) mopts |= Message::Options::Decrypt;