message: sanitize maildir

Remove trailing '/' in maildirs, since people have that (like "/foo/"),
and earlier version didn't complain about that.

Fixes #2298
This commit is contained in:
Dirk-Jan C. Binnema 2022-07-13 23:27:54 +03:00
parent 39d7096bba
commit ed93ff4968
3 changed files with 31 additions and 3 deletions

View File

@ -800,14 +800,22 @@ Message::cache_path(Option<size_t> index) const
return Ok(std::string{priv_->cache_path});
}
// for now this only remove stray '/' at the end
std::string
Message::sanitize_maildir(const std::string& mdir)
{
if (mdir.size() > 1 && mdir.at(mdir.length()-1) == '/')
return mdir.substr(0, mdir.length() - 1);
else
return mdir;
}
Result<void>
Message::update_after_move(const std::string& new_path,
const std::string& new_maildir,
Flags new_flags)
{
const auto statbuf{get_statbuf(new_path)};
if (!statbuf)
if (auto statbuf{get_statbuf(new_path)}; !statbuf)
return Err(statbuf.error());
else
priv_->ctime = statbuf->st_ctime;
@ -820,7 +828,7 @@ Message::update_after_move(const std::string& new_path,
set_flags(new_flags);
if (const auto res = set_maildir(new_maildir); !res)
if (const auto res = set_maildir(sanitize_maildir(new_maildir)); !res)
return res;
return Ok();

View File

@ -208,6 +208,16 @@ public:
*/
Result<void> set_maildir(const std::string& maildir);
/**
* Clean up the maildir. This is for internal use, but exposed for testing.
* For now cleaned-up means "stray trailing / removed".
*
* @param maildir some maildir
*
* @return a cleaned-up version
*/
static std::string sanitize_maildir(const std::string& maildir);
/**
* Get the subject of this message
*

View File

@ -823,6 +823,14 @@ test_message_fail ()
}
}
static void
test_message_sanitize_maildir()
{
assert_equal(Message::sanitize_maildir("/"), "/");
assert_equal(Message::sanitize_maildir("/foo/bar"), "/foo/bar");
assert_equal(Message::sanitize_maildir("/foo/bar/cuux/"), "/foo/bar/cuux");
}
int
main(int argc, char* argv[])
{
@ -844,6 +852,8 @@ main(int argc, char* argv[])
test_message_calendar);
g_test_add_func("/message/message/fail",
test_message_fail);
g_test_add_func("/message/message/sanitize-maildir",
test_message_sanitize_maildir);
return g_test_run();
}